Max*_*.ag 4 c memory arrays structure alignment
我有一个结构数组定义如下:
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字节边界上对齐.机器可能没有内存孔来满足此内存要求.
我不确定我理解你提到的两个选项之间的区别.
C++中的每个类型都有一个自然对齐,其大小是一个倍数.但是对齐不一定等于对象的大小.
例如,int通常具有4个字节的自然对齐,以及4个字节的大小.
但是,虽然1000个int的数组大小为4000字节,但它仍然只需要4字节对齐.
复合类型(结构和数组)只需要与最对齐的成员相同的对齐方式.1000个int的数组只包含一种类型的对象:int.并且该类型需要4字节对齐,因此整个数组也只需要4字节对齐.
同样对于您的示例结构,它的大小(通常)为8个字节,但它包含一个int(需要4个字节的对齐)和一个char(需要1个字节的对齐).因此,任何成员所需的最严格对齐是4 - 因此结构需要4字节对齐