C++ 为什么结构大小与项的普通和不匹配';s码?
对于C/C++结构,通常情况下,最终结构的大小是其所有元素大小的简单总和,但在某些情况下,情况并非如此 我正在寻找以下结构的大小不等于其所有成员大小的技术答案(必须是一个):C++ 为什么结构大小与项的普通和不匹配';s码?,c++,c,padding,memory-alignment,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: "
#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;
}
因此可以看出,
MyStruct
的大小不是4+8+1(13)
,而是24
,但为什么呢?因为C允许编译器在结构的元素之间添加填充,以提高生成的代码的性能
某些硬件允许在将多字节数据放在可被数据大小整除的内存地址时更快地访问这些数据。例如,当int
位于地址0x8004
或0x8008
时,访问32位int
可能比相同的int
位于地址0x8003
或0x8006
时要快得多。该标准允许编译器调整struct
成员的偏移量,以利用这种优化
此外,在某些平台上,访问不与内存空间对齐的多字节值会导致错误:例如,在68000体系结构中,从奇数地址读取16位int
会触发总线错误。编译器知道这一点,它们会向结构添加未使用的空间,以便访问多字节字段不会触发错误。对齐。关于这一点还有很多问题,答案很好。请查阅结构填充的概念。或者只是为了符合底层架构(许多处理器不接受未对齐的内存访问,具体取决于访问的大小)。
Size of int: 4
Size of long: 8
Size of char: 1
Size of MyStruct: 24