按值传递对齐类型或具有对齐类型的结构不适用于某些实现。这会破坏 STL 容器,因为某些方法(例如调整大小)按值获取它们的参数。
我使用 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);
}
编辑。即使使用对齐的分配器,STL 也会失败,因为传递值问题仍然存在。
发现此链接按值传递 __m128