这是我通常写的代码:
alignas(16) __m128 myBuffer[8];
但也许(因为对象数组是 128*8 位 = 128 字节)我应该写:
alignas(128) __m128 myBuffer[8];
或者,第一个例子中的“由于前16个字节是对齐的”,其余的会在内存中自动对齐?
这是我通常写的代码:
alignas(16) __m128 myBuffer[8];
但也许(因为对象数组是 128*8 位 = 128 字节)我应该写:
alignas(128) __m128 myBuffer[8];
或者,第一个例子中的“由于前16个字节是对齐的”,其余的会在内存中自动对齐?
128 位 SIMD 数据类型必须在 16 个字节上对齐。编译器已经知道这一点,因此不需要__m128
手动对齐。例如,参见MSVC 文档__m128
:
类型变量
__m128
在 16 字节边界上自动对齐。
此外,数组是连续的。每个数组元素自然与第一个元素对齐。无需乘以数组的对齐方式。
所以你根本不需要费心alignas
:
__m128 myBuffer[8];
这将起作用。
将 alignas(16) 用于 m128 的数组 [8] 是否正确?
这在技术上并没有错,但根据文档__m128
是对齐到 16 个字节,所以没有必要使用alignas
.
但也许......我应该写:
alignas(128)
如果您的目标是对齐到 128 个字节,那么您可以这样实现。
还是第一个例子中的“由于前16个字节对齐”,其余的会在内存中自动对齐?
这个问题让我很困惑。如果整数对齐,则第一个字节对齐。其余字节从第一个字节偏移。如果大小大于对齐,则一些后续字节将在等于对齐的偏移量处对齐。
请注意,__m128
标准 C++ 中没有。