ZHCUAQ1F july 2015 – april 2023
若要对齐结构体中的数组,请将其放置在具有所需对齐方式的虚拟对象的联合体中。如果您想要做到 8 字节对齐,请使用“long long”虚拟字段。例如:
struct s
{
union u
{ long long dummy; /* 8-字节对齐 */
short buffer[50]; /* 也是 8-字节对齐 */
} u;
...
};
如果要连续声明多个数组并保持给定的对齐方式,可以通过将数组大小(以字节为单位)保持为所需对齐方式的偶数倍来实现。例如:
struct s
{
union u
{ long long dummy; /* 8-字节对齐 */
short buffer[50]; /* 也是 8-字节对齐 */
short buf2[50]; /* 4-字节对齐 */
...
} u;
};
因为 buf1 的大小是 50 * 2 字节/short = 100 字节,并且 100 是 4(而非 8)的偶数倍,所以 buf2 只在 4 字节边界上对齐。将 buf1 填充到 52 个元素会使 buf2 采用 8 字节对齐方式。
在结构体或类中,无法强制执行大于 8 的数组对齐。出于 SIMD 优化的目的,这并非必需的。
在大多数情况下,程序级优化(参见节 4.4)需要在使用-pm -o3 选项的同时,通过一次调用编译器来编译所有源文件。这使编译器能够一次查看所有的源代码,从而启用了很少在其他情况下应用的优化。在这些优化中可以看到,例如,所有对函数 f() 的调用都是将数组的基地址传递给 ptr,因此 ptr 始终正确对齐以进行 SIMD 优化。在这种情况下,不需要 _nassert()。编译器会自动确定 ptr 必须被对齐,并生成优化的 SIMD 指令。