wat*_*180 12 c++ stl sse alignment
通过值传递对齐类型或结构与对齐类型不适用于某些实现.这会破坏STL容器,因为某些方法(例如resize)会按值获取它们的参数.
我使用Visual Studio 2008运行一些测试,并不完全确定何时以及如何通过值失败.我主要担心的是函数foo.它似乎工作正常,但它可能是内联或其他巧合的结果?如果我将其签名更改为void foo(const __m128&)怎么办?
非常感谢您的意见.谢谢.
struct A
{
__m128 x;
int n;
};
void foo(__m128);
void bar(A);
void f1()
{
// won't compile
// std::vector<A> vec1(3);
// compiles, but fails at runtime when elements are accessed
std::vector<__m128> vec2(3);
// this seems to work. WHY???
std::vector<__m128, some_16_byte_aligned_allocator<__m128> > vec3(3);
__m128 x;
A a;
// passed by value, is it OK?
foo(x);
// won't compile
//bar(a);
}
Run Code Online (Sandbox Code Playgroud)
编辑.即使使用对齐的分配器,STL也会失败,因为仍然存在按值传递问题.
发现此链接按值传递__m128
我认为一般来说唯一安全的方法是通过引用传递。某些平台(例如Xbox 360)支持在寄存器中传递向量参数,但我认为这在 x86 上是不可能的。
对于这种std::vector情况,您需要确保分配的内存与 16 字节对齐;否则,当您尝试对未对齐的向量执行大多数操作时,您会崩溃。
如果您支持多个平台,一个安全的计划是使用typedef例如
typedef const MyVector& MyVectorParameter;
Run Code Online (Sandbox Code Playgroud)
然后,您可以在支持向量按值传递的平台上更改 typedef。