我有以下结构:
struct test
{
long long a;
int b;
};
为什么在64位系统中,sizeof测试将是16而不是12?
答案 0 :(得分:2)
您的结构需要8字节对齐,因为成员a
需要8字节对齐(这在您的系统上,其他系统可能有不同的对齐要求和大小int
和{{ 1}})。这包括结构数组的每个成员。因此,为了确保结构的数组元素的正确对齐,填充大小以提供8字节对齐。
符合标准的答案是:"因为编译器可以"。上面的答案是"这可能发生了什么以及为什么"。
答案 1 :(得分:-2)
在64位系统上,内存总是以8个字节的块分配,以便更好(更简单)地进行内存管理。 1 int
和long long
的严格最小大小为12,但是最高的8的最接近的倍数是16,因此使用此数字。还分配了4个额外字节;这不会杀死你的系统,但使内存管理更容易。尝试在char
中添加struct
甚至2个字符。大小仍然是16个字节。
这是因为数据总线在64位计算机上也是64位宽,因此需要传输8字节的块来有效地填充高速缓冲存储器。仍然可以访问单个内存位置(当然),它的唯一分配和传输必须以更大的块执行。在你的情况下,如果分配了14个字节,那么每当系统尝试获取结构时,将获取4个额外字节。为什么?因为系统的数据总线大小,所有传输总是64位(8字节)。要获取12个字节,将使用4个传输,实际上将带来16个字节。这些额外的字节,如果不处理,可能会导致内存问题。想象一下你的结构数组,提取的额外字节数及其管理。
由于系统设计无论如何都会取出这些字节,因此避免此类问题的最简单方法是始终分配8字节(64位)的块,这正是您所观察到的情况。