c++ - 为什么 32 位和 64 位程序的结构大小不同?

标签 c++ c

下面是一个简单的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字节(因为 char1 字节长,而 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/

相关文章:

c++ - 模板特化和 enable_if 问题

c++ - 使用 Objective-C 获取 Photoshop 的 Action 列表

c - 使用 Malloc 连接两个字符串

C++ 11 的 C++ 编译问题

c++ - operator<< 打印一个底层类型为 short 的枚举值是不明确的

c - 函数指针的内存分配

c - 使用MACRO摇动排序

c++ - cvLoadImage 无法在使用 C 的 Xcode 中工作

c - 是否有任何编译器/预处理器技巧来调试打印枚举名称?

c++ - 在C++运行时创建多个不确定数量的链表