gpt4 book ai didi

c - 计算 C 中结构的大小(数据对齐问题)

转载 作者:太空宇宙 更新时间:2023-11-03 23:28:22 24 4
gpt4 key购买 nike

考虑以下代码段:

struct MixedData {
char a;
short b;
char c;
long d;
char e;
};

int main() {
cout<<sizeof(MixedData)<<endl;
}

(忽略 C++ 语法,因为它不是这里的问题)
这段代码的输出是24,我不太明白为什么。
我将表示:
C: 字符
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,这是应该的。
有人对此有解释吗?

最佳答案

如果你的“long”是 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 | ...

请注意,第二个 long 值被分成 2 个不同的 8 字节 block !它位于距数组开头的偏移量 28 处,8 字节 block 从 24 和 32 开始...

同理,char a;长 b;将是 16 个字节 - char 将被填充到 8 个字节以将 long 保持在 8 个字节的边界。

关于c - 计算 C 中结构的大小(数据对齐问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21234347/

24 4 0
文章推荐: VC2012中与fwrite的混淆
文章推荐: node.js - Nodejs : TypeError: Object # has no method 'endianness'