Visual Studio参数对齐限制和Windows x64 ABI



对于WIN32上的Visual c++,有一个长期存在的问题,即带有4个或更多SSE参数的函数,例如

__m128i foo4(__m128i m0, __m128i m1, __m128i m2, __m128i m3) {}

生成错误:

align.c(8) : error C2719: 'm3': formal parameter with __declspec(align('16')) won't be aligned

使问题更加复杂的是,即使函数是__inline, Visual c++仍然不必要地施加ABI限制。

我想知道这在64位Windows上是否仍然是一个问题?ABI限制在x64上仍然适用吗?

(我不能使用64位的Windows系统,否则我会自己尝试,而且广泛的谷歌搜索没有出现任何明确的结果)

您可以在x64下传递尽可能多的128位SSE固有参数。x64 ABI在设计时就考虑到了这些类型。

来自MSDN文档:

__m128类型,数组和字符串从不通过直接值传递,而是通过指针传递给调用者分配的内存。大小为8、16、32或64位的结构体/联合和__m64被当作相同大小的整数传递。这些大小以外的结构体/联合作为指针传递给调用者分配的内存。对于这些作为指针传递的聚合类型(包括__m128),调用者分配的临时内存将按16字节对齐。

最新更新