1

我有以下结构:

struct test                                                                                                                     
{                                                                                                                               
  long long a;                                                                                                                
  int b;                                                                                                                         
}; 

为什么在 64 位系统中 sizeof 测试将是 16 而不是 12?

4

2 回答 2

2

您的结构需要 8 字节对齐,因为成员a需要 8 字节对齐(这是在您的系统上,其他系统可能有不同的对齐要求和大小intlong long。这包括结构数组的每个成员。因此,为了确保结构的数组元素正确对齐,填充大小以提供 8 字节对齐。

符合标准的答案是:“因为编译器可以”。上面的答案是“这可能是发生了什么以及为什么”。

于 2013-02-12T08:10:15.457 回答
-2

在 64 位系统上,内存总是以 8 字节的块分配,以便更好(更容易)进行内存管理。int1和 1的严格最小尺寸long long是 12,但由于较高侧最接近的 8 倍数是 16,所以使用这个数字。还分配了 4 个额外的字节;这不会杀死您的系统,但会使内存管理更加容易。尝试char在您的struct. 大小仍将保持 16 字节。

这是因为数据总线在 64 位机器上也是 64 位宽的,因此需要传输 8 字节的块来有效地填充高速缓存存储器。仍然可以访问单个内存位置(当然),它唯一的分配和传输必须在更大的块中执行。如果在您的情况下分配了 14 个字节,那么每当系统尝试获取该结构时,将获取 4 个额外的字节。为什么?因为由于系统的数据总线大小,所有传输总是 64 位(8 字节)。要获取 12 个字节,将使用 4 次传输,这实际上会带来 16 个字节。如果不处理这些额外的字节,可能会导致内存问题。想象一下,有一个结构数组、提取的额外字节及其管理。

由于系统设计无论如何都会获取这些字节,因此避免此类问题的最简单解决方案是始终分配 8 字节(64 位)的块,这正是您观察到的情况。

于 2013-02-12T08:14:14.500 回答