2

这是我通常写的代码:

alignas(16) __m128 myBuffer[8];

但也许(因为对象数组是 128*8 位 = 128 字节)我应该写:

alignas(128) __m128 myBuffer[8];

或者,第一个例子中的“由于前16个字节是对齐的”,其余的会在内存中自动对齐?

4

2 回答 2

2

128 位 SIMD 数据类型必须在 16 个字节上对齐。编译器已经知道这一点,因此不需要__m128手动对齐。例如,参见MSVC 文档__m128

类型变量__m128在 16 字节边界上自动对齐。

此外,数组是连续的。每个数组元素自然与第一个元素对齐。无需乘以数组的对齐方式。

所以你根本不需要费心alignas

__m128 myBuffer[8];

这将起作用。

于 2021-09-02T14:51:33.207 回答
1

将 alignas(16) 用于 m128 的数组 [8] 是否正确?

这在技术上并没有错,但根据文档__m128是对齐到 16 个字节,所以没有必要使用alignas.

但也许......我应该写:alignas(128)

如果您的目标是对齐到 128 个字节,那么您可以这样实现。

还是第一个例子中的“由于前16个字节对齐”,其余的会在内存中自动对齐?

这个问题让我很困惑。如果整数对齐,则第一个字节对齐。其余字节从第一个字节偏移。如果大小大于对齐,则一些后续字节将在等于对齐的偏移量处对齐。


请注意,__m128标准 C++ 中没有。

于 2021-09-02T14:05:27.890 回答