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

Why struct size do not match with plain sum of item's sizes?

本文关键字:不匹配 结构 项目 为什么      更新时间:2023-10-16

对于 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,但为什么呢?

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

当多字节数据放置在可被数据大小整除的内存地址时,某些硬件允许更快地访问多字节数据。例如,当int位于地址 0x80040x8008 时,访问 32 位int的速度可能比同一int位于地址0x80030x8006时快得多。该标准允许编译器调整struct成员的偏移量以利用此类优化。

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