我有一个广泛使用SSE内在函数的大型代码库,该代码库仅在GCC下针对x86_64平台开发。在堆栈上分配了很多__m128
和float[4]
,在x86_64上使用GCC进行编译时,它们总是对齐到16字节。
我们正在测试clang,它在未对齐的SSE加载和存储以及堆栈变量上崩溃。
似乎我可以__attribute__ ((aligned(16)))
有没有办法强制clang将所有变量全局对齐为16个字节?我在文档中找不到任何内容。
答案 0 :(得分:4)
__m128
局部变量应该与任何编译器对齐16个字节,并且不需要任何其他工作。 float[4]
仅具有4个字节的对齐方式,因此您需要为此添加合适的指令。大多数人为此使用宏,例如
#ifdef _MSC_VER
// MSVC...
#define ALIGN(n) declspec(align(n))
#else
// the civilised world...
#define ALIGN(n) __attribute__ ((aligned(n)))
#endif
,然后将变量声明为例如:
ALIGN(16) float[4] my_floats;