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

标签 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:字符
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/

相关文章:

c - 标记结构初始化、函数及其参数

c - 创建节点数组后,我无法遍历链接列表

c - C 中的指针语法 : why does * only apply to the first variable?

c - 数组的地址和数组地址的地址

c - 如何使用带有 PGI 编译器的 C/OpenACC 声明全局动态数组

python - 如何在 Google Colab 中对齐输出(图表)?

arrays - 如何创建从 MATLAB 中的结构体中提取的值的字符串数组?

c - 在链表中插入和删除节点

c++ - 我需要在 C++ 中对齐吗?

css - 如何使换行文本的第二行出现在第一行的正下方,如图 :