下面是一个简单的C
程序:
#include <stdio.h>
typedef struct
{
char a;
double b;
} A;
int main(void) {
printf("sizeof(A) is %d bytes\n", sizeof(A));
return 0;
}
当我把它编译成32位
程序时,输出是:
sizeof(A) is 12 bytes
我知道结构内存模型应该是:
____________________________
|a|3 padding| b |
————————————————————————————
但是当我将它编译成64位
程序时,输出是:
sizeof(A) is 16 bytes
所以结构内存模型应该是:
____________________________________
|a|7 padding | b |
____________________________________
个人认为无论程序是32位
还是64位
,结构体的大小都应该是16
字节(因为 char
是 1
字节长,而 double
的对齐是 8
字节)。为什么在32位
程序中大小是12
字节?
最佳答案
在 Intel CPU、32 位和 64 位机器上,“SIMD”变体的浮点指令在一台机器上读取/写入 16 字节(2 个 double )或 8 个字节(一个 double )操作说明。这些是处理 float 的最常见指令。这完全是速度的问题:
读取单个数据项可以通过“对齐读取指令”或“非对齐读取指令”来完成。确保对齐的版本更快。未对齐的指令必须处理复杂的情况,其中数据在两个高速缓存行甚至两个不同的内存页面之间拆分。 此外,CPU 针对某些指令进行了优化,即对齐指令。 如此优化,以至于读取 1 个字节的数据比读取 16 个对齐的字节更耗时。 8088 的古老的 1 字节指令( MOV AL/MOV AH 等)没有经过硬件优化。
编译器编写者必须选择密集代码或快速代码。在过去,当我的 PC 有 16 KB 内存时,内存是稀缺的。稍后,可以指示编译器准确地对齐结构成员。当 64 位 CPU 出现时,内存足够便宜,结构大小成为 16 字节的倍数,并且每个结构成员都在其自然边界上对齐 - 根据其类型:shorts 的偶地址,mod(4,0)对于 int 和 float ,mod(8,0) 对于 _int64 和 double ,mod(16,0) 对于 _mm128,mode(32,0) 对于 _mm256
关于c++ - 为什么 32 位和 64 位程序的结构大小不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27834219/