1

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

4

1 回答 1

2

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

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

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

于 2013-09-24T20:48:16.757 回答