考虑以下代码段:
struct MixedData {
char a;
short b;
char c;
long d;
char e;
};
int main() {
cout<<sizeof(MixedData)<<endl;
}
(忽略C ++语法,因为这不是问题)
这段代码的输出是24,我不太明白为什么
我会说:
C :char
S :短期
L :长
P :编译器填充
和每个| |是一个字节
据我所知,数据调整是:
|C|P|S|S|C|P|P|P|L|L|L|L|L|L|L|L|C|P|P|P|
所以输出应该是20,不应该吗? 有趣的是,当MixedData成为:
struct MixedData {
char a;
short b;
char c;
int d;
char e;
};
尺寸变为16,应该如此 有没有人对此有解释?
答案 0 :(得分:2)
如果你的“长”是8个字节,那么将会发生什么:
C P S S C P P P L L L L L L L L C P P P P P P P P
最后4个填充字节使总结构大小为8个字节的倍数。
如果您想知道为什么会这样,那是因为您希望对每个结构成员的访问进行对齐。您的平台显然是64位(8字节)。如果我们没有最后4个填充字节,则结构数组将为:
C P S S C P P P L L L L L L L L C P P P | C P S S C P P P L L L L L L L L C P P P | ...
请注意,第二个长值分为2个不同的8字节块!它距离数组的起始位置偏移28,而8字节的块起始于24和32 ......
出于同样的原因,char a;长b;将是16个字节 - 将字符填充为8个字节,以保持长度为8字节边界。