为什么结构大小与项目大小的简单总和不匹配?

时间:2013-09-24 20:46:10

标签: c++ c padding memory-alignment

对于C / C ++结构,通常,最终结构的大小是其所有元素大小的简单总和,但有些情况并非如此。

我正在查看以下结构的大小不等于其所有成员的大小的技术答案(必须是一个):

#include <iostream>

struct {
    int a;
    long b;
    char c;
} typedef MyStruct;

int main() {
    MyStruct sss;
    std::cout << "Size of int: " << sizeof(int) << std::endl << "Size of long: " << sizeof(long) << std::endl << "Size of char: " << sizeof(char) << std::endl;
    std::cout << "Size of MyStruct: " << sizeof(sss) << std::endl;
    return 0;
}

Thas有以下输出:

Size of int: 4
Size of long: 8
Size of char: 1
Size of MyStruct: 24

所以可以看出MyStruct的大小不是4+8+1 (13)而是24,实际上是{{1}},但为什么呢?

1 个答案:

答案 0 :(得分:2)

因为C允许编译器在struct的元素之间添加填充,以使生成的代码更高效。

当这些数据被放置在可被数据大小整除的存储器地址时,某些硬件允许更快地访问多字节数据。例如,当int位于地址int0x8004时,访问32位0x8008可能会明显快于int位于0x8003在地址0x8006struct。该标准允许编译器调整int成员的偏移量以利用此类优化。

此外,有些平台访问与内存空间对齐的多字节值 会导致错误:例如,从奇数地址读取16位struct在68000架构中触发总线错误。编译器知道这一点,并且他们将未使用的空间添加到{{1}},以便访问多字节字段不会触发错误。