我有一系列结构定义如下:
struct {
int x;
char y;
} arr[10];
我机器上int的大小是4个字节,char是1个字节。我知道结构将在内部填充,即数组的每个元素将具有8个字节的大小。但我想知道是否
1)这是因为下一个数组元素中的int类型成员的对齐要求或
2)是因为每个结构本身应该在8字节边界上对齐,因为需要在结构类型变量上进行自然对齐。
为了使我的观点更加明确,应该是第一个数组成员的起始地址? 如果它是第二种情况中指出的8字节对齐地址,则在定义大型2-D数组时可能会出现问题,如:
int arr [1000] [1000];
这里,2-D阵列的每个元素(即每个1-D阵列)应该在4000字节边界上对齐。机器可能没有内存孔来满足此内存要求。
答案 0 :(得分:5)
我不确定我理解你提到的两个选项之间的区别。
C ++中的每个类型都有一个自然对齐,其大小是一个倍数。但是对齐不一定等于对象的大小。
例如,int通常具有4个字节的自然对齐,以及4个字节的大小。
但是,当1000个int的数组大小为4000字节时,它仍然只需要4字节对齐。
复合类型(结构和数组)只需要与最对齐的成员进行相同的对齐。 1000个int的数组只包含一种类型的对象:int。而且这种类型需要4字节对齐,因此整个数组也只需要4字节对齐。
同样对于您的示例结构,它的大小(通常)为8个字节,但它包含一个int(需要4个字节的对齐)和一个char(需要1个字节的对齐)。因此,任何成员所需的最严格的对齐是4 - 因此结构需要4字节对齐