确定C中结构的大小(数据对齐问题)

时间:2014-01-20 12:36:39

标签: c struct alignment primitive-types

考虑以下代码段:

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,应该如此 有没有人对此有解释?

1 个答案:

答案 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字节边界。