在编译期间确定 C 类的大小
了解类大小和内存对齐
在 C 中,类大小在编译期间静态确定,以优化内存分配和访问。为了有效地计算类大小,编译器会考虑各种因素,包括数据成员大小和对齐要求。
数据成员对齐和大小计算
对于普通旧数据 (POD) ) 具有确定大小的数据成员的类,通常适用以下规则:
- 每个数据成员拥有大小 (s) 和对齐要求 (a)。
- 编译器的初始值大小 (S) 设置为 0,而对齐 (A) 设置为 1 字节。
-
按顺序处理成员:
- 检查对齐要求 (a) 。如果 S 不能被 a 整除,则增加 S 以使成员对齐到正确的偏移量。
- 将 A 更新为当前 A 和 a 的最小公倍数。
- 将 S 增加 s 至容纳该成员。
- 处理完所有成员后,确保S能被A整除;如果不是,则相应地增加 S。
- S 的最终值代表班级大小。
其他注意事项
- 数组:大小的计算方式为元素数量乘以元素大小; alignment 是元素的对齐要求。
- 结构:使用相同的规则递归计算大小和对齐。
- 联合:大小是最大成员的大小加上满足以下条件的任何填充:所有成员对齐的最小公倍数。
示例:TestClass3
对于 TestClass3,大小计算如下:
- buf[8] 需要 8 个字节,对齐方式为 1,因此 S 变为 8。
- __m128i vect 需要 16 个字节,对齐方式为 16。 S 首先增加到 16 以进行对齐,然后增加到 32 以容纳 vect。
- buf2[8] 需要 8 个字节,对齐方式为 1。S 增加到 24。
- 由于 24 不能被 16 整除,所以 S 增加 8 到 32。
因此,TestClass3 的大小为 32 字节。
结论
通过遵守这些对齐和大小计算规则,编译器可确保最佳的内存分配和高效C 类的数据访问。
以上是C编译器在编译过程中如何计算类的大小?的详细内容。更多信息请关注PHP中文网其他相关文章!