问个简单问题散点分

ecsape 2010-06-25 09:37:44
昨天去面试,面试官用一系列内存对齐问题把我问的哑口无言。看来我的水平还是不行啊,回来搜了下相关文章,大概明白了些,但有些问题还是混乱的,望大家指教。

union D
{
char a[5];
int b;

};
struct test_t {
int a;
char b;
char c[10];
D d;
short e;

};


概括了下,大概是这几个问题:
1. sizeof(test_t) 是多少?
2. sizeof(test_t)在linux,unix,windows上是否有区别?
3.sizeof(test_t)在32位机和64位机上是否有区别?
4.sizeof(test_t)和编译器是否有关系?
...全文
268 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
深圳函数 2010-07-05
  • 打赏
  • 举报
回复
我在我的pc windowsXP机上,写了个程序,测试了一下:
#include <stdio.h>
union D
{
char a[5];
int b;
};
struct test
{
int a;
char b;
char c[10];

union D d;
short e;
};
int main()
{
struct test s;
union D a;
printf("%d\n%d\n%d\n%d\n",sizeof(s),sizeof(a),sizeof(int),sizeof(short));
system("pause");
system("cls");
return 0;
}
输出:
20
5
2
2
ecsape 2010-06-28
  • 打赏
  • 举报
回复
结帖晚了,分不够分了,后面几位只接分的就给少点了。
zhjl1314 2010-06-27
  • 打赏
  • 举报
回复
呵呵,顶4楼和13楼,关键还是看编译器
顺便接分~
luomoweilan 2010-06-26
  • 打赏
  • 举报
回复
每天发个贴,健康一整年
天亮后说晚安 2010-06-26
  • 打赏
  • 举报
回复
sizeof(test_t)和编译器有关
  • 打赏
  • 举报
回复
好吧,我来学习加接分!
ecsape 2010-06-25
  • 打赏
  • 举报
回复
恩,刚才就是分别去redhat,windows,64位机上验证了。wenxy1解释的很详细啊。
Wenxy1 2010-06-25
  • 打赏
  • 举报
回复
这种问题,可以在开发工具中,验证,我用VC++6.0在windows xp 32bit版本中验证过,
取结构体成员的地址,很容易分析出在哪些地方做了填充。
struct test_t x;
&x
&x.a
&x.b
&x.c
&x.d
&x.d.a
&x.d.b
&x.e

或者直接在工具中查看变量的地址。
Wenxy1 2010-06-25
  • 打赏
  • 举报
回复
更正一个注释:
/* padding 3 bytes, 例D的开始偏移地址为 15+1=16 bytes */
更正为:/* padding 1 bytes, 例D的开始偏移地址为 15+1=16 bytes */
Wenxy1 2010-06-25
  • 打赏
  • 举报
回复

union D
{
char a[5];
int b;
/* padding 3 bytes, 使unin的总长度为 4bytes*2倍=8bytes */
};
struct test_t
{
int a; /* 4 bytes, 注意,默认是4bytes对齐 */
char b; /* 1 bytes */
char c[10]; /* 10 bytes */
/* padding 3 bytes, 例D的开始偏移地址为 15+1=16 bytes */
union D d; /* 8 bytes */
short e; /* 2 bytes, padding 8 bytes, 才能使 test_t的总体大小符合 10的整数倍,即(26+2bytes节填充长度)=28bytes */
/* 编译器自动在此处填充2bytes, 注意到此结构体的最大基本类型是int型,即结构体的总长度是int型长度的整数度 */
};


概括了下,大概是这几个问题:
1. sizeof(test_t) 是多少?
28
2. sizeof(test_t)在linux,unix,windows上是否有区别?
可能有区别,因为linux支持多种硬件平台,例如:arm, mips, x86, power pc等。
3.sizeof(test_t)在32位机和64位机上是否有区别?
没区别。
4.sizeof(test_t)和编译器是否有关系?
有。
zjf30366 2010-06-25
  • 打赏
  • 举报
回复
http://zjf30366.blog.163.com/blog/static/4111645820095455914368/[Quote=引用 4 楼 wenxy1 的回复:]
1. 在32bit平台,64bit平台上,有些C的数据类型有区别。
2. 编译器对结构体对齐,默认是4 bytes对齐。
3. 结构体对齐原则:
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填……
[/Quote]
yzx714 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wenxy1 的回复:]

1. 在32bit平台,64bit平台上,有些C的数据类型有区别。
2. 编译器对结构体对齐,默认是4 bytes对齐。
3. 结构体对齐原则:
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上……
[/Quote]4楼 Good job!
周靖峰 2010-06-25
  • 打赏
  • 举报
回复
我承认,我是接分的
Wenxy1 2010-06-25
  • 打赏
  • 举报
回复
1. 在32bit平台,64bit平台上,有些C的数据类型有区别。
2. 编译器对结构体对齐,默认是4 bytes对齐。
3. 结构体对齐原则:
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
ecsape 2010-06-25
  • 打赏
  • 举报
回复
行。看有多少人睬我,来决定给您多少分。
[Quote=引用 2 楼 steptodream 的回复:]

只接分 可以么?
[/Quote]
steptodream 2010-06-25
  • 打赏
  • 举报
回复
只接分 可以么?
brookmill 2010-06-25
  • 打赏
  • 举报
回复
sizeof(test_t)和编译器当然有关系。你用Turbo C来编译肯定不一样,他的int是2字节。
32位和64位系统的int都是4字节,所以结果应该一样。如果其中有long或者指针,就会有区别了。
其实我是来接分的……
ecsape 2010-06-25
  • 打赏
  • 举报
回复
除了第一个问题我知道需要考虑内存对齐,但是又算不出来具体数外,其余我都不知道。
自沙下。
freetstar 2010-06-25
  • 打赏
  • 举报
回复
围观。。。
lwenjie 2010-06-25
  • 打赏
  • 举报
回复
接分 回复内容
加载更多回复(6)

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧