我有一个定义如下的结构体数组:
struct { int x; char y; } arr[10];
在我的机器上,int类型占用4个字节,char类型占用1个字节。我知道这些结构体会在内部填充,也就是说每个数组元素的大小将为8个字节。但是我想知道:
1) 这是因为下一个数组元素中的int类型成员需要对齐要求,还是
2) 因为由于结构体类型变量的自然对齐要求,每个结构体本身都应该对齐在8字节边界上。
为了让我的观点更清晰,第一个数组成员的起始地址应该是什么? 如果它是一个8字节对齐的地址,正如第二种情况所指出的那样,这可能会成为定义大型二维数组时的问题,例如:
int arr[1000][1000];
这里,每个二维数组元素(即每个一维数组)应该在4000字节边界上对齐。机器可能没有足够内存来满足这种内存需求。
struct { int x; char y; } arr[10];
在我的机器上,int类型占用4个字节,char类型占用1个字节。我知道这些结构体会在内部填充,也就是说每个数组元素的大小将为8个字节。但是我想知道:
1) 这是因为下一个数组元素中的int类型成员需要对齐要求,还是
2) 因为由于结构体类型变量的自然对齐要求,每个结构体本身都应该对齐在8字节边界上。
为了让我的观点更清晰,第一个数组成员的起始地址应该是什么? 如果它是一个8字节对齐的地址,正如第二种情况所指出的那样,这可能会成为定义大型二维数组时的问题,例如:
int arr[1000][1000];
这里,每个二维数组元素(即每个一维数组)应该在4000字节边界上对齐。机器可能没有足够内存来满足这种内存需求。