11

按值传递对齐类型或具有对齐类型的结构不适用于某些实现。这会破坏 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

4

2 回答 2

2

我认为通常唯一安全的方法是通过引用传递。一些平台(例如Xbox 360)支持在寄存器中传递向量参数,但我认为这在 x86 上是不可能的。

对于这种std::vector情况,您需要确保分配的内存与 16 字节对齐;否则,当您尝试对未对齐的向量执行大多数操作时,您会崩溃。

如果您支持多个平台,一个安全的计划是使用typedef例如

typedef const MyVector& MyVectorParameter;

然后,您可以在支持向量值传递的平台上更改 typedef。

于 2010-12-13T00:26:54.300 回答
1

经常使用的 resize() 函数导致所有对齐,也许您可​​以尝试为 __m128 专门化矢量模板?

于 2010-12-13T01:29:46.380 回答