level 1
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
经分析:
在B结构体里:
char c与double d之间存在一个4字节空隙。
——————
偏移 变量
0x0 char c
0x8 double d
0x10 int a
——————
具体为什么是24字节,暂时没找到答案。
2012年08月10日 11点08分
4
是不是double要对齐到8字节???傻×不懂球破。。。
2012年08月10日 11点08分
回复 矮油嫑酱紫唉 :标准不管具体对齐多少……
2012年08月10日 12点08分
level 10
24的话,看着像64bit环境8-byte alignment,外加int 64bits长,还是说下编译器的好
当然也许double也存在变数,char变数可忽略
2012年08月10日 11点08分
6
level 1
一大神做了如下几解释:
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
觉得很合理,和输出结果也相符。大家以为如何?
2012年08月13日 03点08分
7
晕死,百度百科上就有。
2012年08月13日 05点08分