4

我有一个定义如下的结构数组:

struct { int x; char y; } arr[10];

我机器上 int 的大小是 4 个字节,一个 char 是 1 个字节。我知道结构将在内部填充,即数组的每个元素的大小为 8 个字节。但我想知道是否

1) 这是因为 int 类型成员在下一个数组元素中的对齐要求或

2)是因为每个结构本身应该在8字节边界上对齐,因为结构类型变量需要自然对齐。

为了让我的观点更清楚,数组第一个成员的起始地址应该是什么?如果它是第二种情况中指出的 8 字节对齐地址,则在定义大型二维数组时可能会出现问题,例如:

int arr[1000][1000];

这里二维数组的每个元素(即每个一维数组)都应该在 4000 字节的边界上对齐。机器可能没有内存孔来满足此内存要求。

4

1 回答 1

5

我不确定我是否理解您提到的两个选项之间的区别。

C++ 中的每种类型都有一个自然对齐,它的大小是倍数。但对齐不一定等于对象的大小。

例如,一个 int 通常具有 4 个字节的自然对齐和 4 个字节的大小。

但是,虽然 1000 个整数的数组大小为 4000 字节,但它仍然只需要 4 字节对齐。

复合类型(结构和数组)只需要与其最对齐的成员相同的对齐方式。一个 1000 个 int 的数组只包含一种类型的对象:int。而那个类型需要4字节对齐,所以整个数组也只需要4字节对齐。

同样,对于您的示例结构,它的大小(通常)为 8 个字节,但它由一个 int(需要 4 个字节对齐)和一个 char(需要 1 个字节对齐)组成。因此,其任何成员所需的最严格对齐是 4 - 因此该结构需要 4 字节对齐

于 2013-06-16T19:01:54.900 回答