对于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}},但为什么呢?
答案 0 :(得分:2)
因为C允许编译器在struct
的元素之间添加填充,以使生成的代码更高效。
当这些数据被放置在可被数据大小整除的存储器地址时,某些硬件允许更快地访问多字节数据。例如,当int
位于地址int
或0x8004
时,访问32位0x8008
可能会明显快于int
位于0x8003
在地址0x8006
或struct
。该标准允许编译器调整int
成员的偏移量以利用此类优化。
此外,有些平台访问与内存空间对齐的多字节值 会导致错误:例如,从奇数地址读取16位struct
在68000架构中触发总线错误。编译器知道这一点,并且他们将未使用的空间添加到{{1}},以便访问多字节字段不会触发错误。