你的机器是64位按8字节对齐分配空间,因此struct S1是24,分析如下:
struct S1
{
char *a, *b; 8*2
int c; 8*2+4+补4 因为按8字节对齐,所以补齐为8的倍数
char d; 8*2+8+1+补7 同上,结果=24
};
struct S2
{
char a; 1
struct S1 b; 1+补7+24 先补齐成8的倍数,再+struct S1的size
char c; 8+24+1+补7,同上原理,结果=40
};
在*86__32bit机上运行,S1: 4*2+4+4 = 16, S2:4+16+4=24;在s1中,由于最大的类型长度为4byte,故而该结构体关于4byte对齐;而对s2,由于含有结构体s1的嵌套,它关于它自身所定义的变量中的最大类型长度对齐,而不是关于结构体S1对齐, 关于结构体"对齐"问题比较饶人,你可以上网多搜搜这方面的资料,再琢磨琢磨,希望对你有帮助。
64位的机器,指针要占8个字节,呵呵,还真不知道哩。
结构体中是按照结构体中某个类型的最大基本单位宽度来对齐的。
当结构体中某个类型的最大基本单位宽度超过机器字长,那么就只要按机器字长对齐就行了,而且占用空间只需要是机器字长的整数倍就好了。
#include
struct S1
{
char *a, *b;
int c;
char d;
};
struct S2
{
char a;
struct S1 b;
char c;
};
int main () {
printf("%d %d\n", sizeof(S1), sizeof(S2));
//while (1);
return 0;
}
我的是32位系统,输出是16和24
内存管理优化了, 你要知道, 内存对齐的目的, 只要能够用最小的内存对齐了,就好了, 不会过多的浪费内存。