以下是引用S140131022在2018-3-12 12:11:30的发言:
大佬解答一下:
今天又看到了一段c++程序,代码如下:
32位机器上定义了如下结构体:
struct xx
{
long long x1;
char _x2;
int _x3;
char _x4[2];
static int _x5;
}
int xx::_x5;
sizeof(struct xx) = 24;
因为longlong 8 char 1 空3 int 4 char[] 2 等于18
又由于必须是各成员的整数倍,故取最小值为24;
请问为何这个代码需要取限定条件: 大小必须是成员的整数倍
而上面的代码却不必呢?
这段没看到有“指定对齐”,只能从“自身对齐”看。
规则:结构体的自身对齐值是其成员中自身对齐值最大的那个值。这里最大的那个是 long long x1,其自身对齐值为8字节。所以,有效对齐值 8 字节:
第1块8字节:刚好存放 long long x1;
第2块8字节:可存放 char _x2; 和 int _x3; 同理_x2与_x3自身对齐值最大的,_x2加3字节补齐。
第3块8字节:可存放 char _x4[2]; 和 int _x5; 同理_x4与_x5自身对齐值最大的,_x4加2字节补齐。
总共分配24字节(3块8字节)存放各成员。
如果后面再增加一个成员:char _x6;
struct xx
{
long long x1;
char _x2;
int _x3;
char _x4[2];
static int _x5;
char _x6;
}
就要多增加一块:
第4块8字节:可存放 char _x6; _x6加7字节补齐。
总共分配32字节(4块8字节)存放各成员。
[此贴子已经被作者于2018-3-12 15:16编辑过]