步骤如下:
- 初始值
0
- 对每个元素,尺寸
上舍入到该元素的alignment的整数倍,然后加上该元素的尺寸。
- 将最后结果
上舍入到所有元素的alignment的最小公倍数。
例子:
struct foo {
char a;
int b;
char c;
};
- 尺寸初始为
0
- 先上舍入到
char(1)的alignment的整数倍,仍然为0
- 加上
char(1)的尺寸,变成1
- 上舍入到
int(4)的alignment,变成4
- 加上
int(4)的尺寸,变成8
- 上舍入到
char(1)的alignment的整数倍,仍然是8
- 加上
char(1)的尺寸,变成9
- 最后结果上舍入到
char(1)和int(4)的alignment的最小公倍数,变成12
所以这个struct的尺寸就是12字节。
更新
其中第3步是为了保证数组情况下每个struct的所有元素都能够对齐,而数组成员在内存中是连续的,所以必须保证连续2个struct的间隔是struct中所有元素的alignment的最小公倍数(数学问题,可画图思考)。
更新2
每种基础数据类型在各arch上的alignment是hardcode在编译器里的。