菜鸟求教
c++吧
全部回复
仅看楼主
level 1
btt1095347198 楼主
struct A
{
char c;
int a;
double d;
};
struct B
{
char c;
double d;
int a;
};
sizeof(A)= 16; zizeof(B) = 24
sizeof(A) = 16懂,但sizeof(B) = 24是咋回事啊....
2012年08月10日 09点08分 1
level 7
字节对齐。以4大小对齐。
2012年08月10日 09点08分 2
不足补齐
2012年08月10日 09点08分
回复 win2446 :按你的意思是struct H{short s;}; sizeof(H)应该也为4吧。但是结果是2,c++对象模型上是说了以4的整数。但实际好像应该是以最大字节变量的整数对其
2012年08月10日 11点08分
回复 win2446 :而且你这个也解释不了第二个为啥是24啊
2012年08月10日 11点08分
level 8
我连第一个都不懂。。。[汗]
2012年08月10日 09点08分 3
level 7
经分析:
在B结构体里:
char c与double d之间存在一个4字节空隙。
——————
偏移 变量
0x0 char c
0x8 double d
0x10 int a
——————
具体为什么是24字节,暂时没找到答案。
2012年08月10日 11点08分 4
召唤神犇:@矮油嫑酱紫唉 
2012年08月10日 11点08分
是不是double要对齐到8字节???傻×不懂球破。。。
2012年08月10日 11点08分
回复 @win2446 :这种问题需召唤标准帝@幻の上帝 ,咱们先参与一下也不妨。。
2012年08月10日 11点08分
回复 矮油嫑酱紫唉 :标准不管具体对齐多少……[汗]
2012年08月10日 12点08分
level 10
在大多数情况下会自动对齐到4个字节。。。
2012年08月10日 11点08分 5
他主要是问结构体B为什么是24
2012年08月10日 11点08分
回复 win2446 :正解,这个是主要
2012年08月10日 11点08分
回复 win2446 :我输出结构体内个变量的地址值后简直是惨不忍睹啊,我越来越蒙了。
2012年08月10日 11点08分
level 10
24的话,看着像64bit环境8-byte alignment,外加int 64bits长,还是说下编译器的好
当然也许double也存在变数,char变数可忽略
2012年08月10日 11点08分 6
++
2012年08月10日 12点08分
level 1
btt1095347198 楼主
一大神做了如下几解释:
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
觉得很合理,和输出结果也相符。大家以为如何?

2012年08月13日 03点08分 7
晕死,百度百科上就有。
2012年08月13日 05点08分
1