Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么结构大小与项的普通和不匹配';s码?_C++_C_Padding_Memory Alignment - Fatal编程技术网

C++ 为什么结构大小与项的普通和不匹配';s码?

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: "

对于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;
}

因此可以看出,
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