C++ 对齐类型和按值传递参数

C++ 对齐类型和按值传递参数,c++,stl,alignment,sse,C++,Stl,Alignment,Sse,通过值传递对齐类型或具有对齐类型的结构在某些实现中不起作用。这会破坏STL容器,因为某些方法(如resize)按值获取其参数 我使用VisualStudio2008运行了一些测试,但不完全确定“传递值”何时以及如何失败。我主要关心的是函数foo。它似乎工作得很好,但这可能是内联或其他巧合的结果吗?如果我将其签名更改为void foo(const_um128&),该怎么办 非常感谢您的意见。多谢各位 struct A { __m128 x; int n; }; void foo(

通过值传递对齐类型或具有对齐类型的结构在某些实现中不起作用。这会破坏STL容器,因为某些方法(如resize)按值获取其参数

我使用VisualStudio2008运行了一些测试,但不完全确定“传递值”何时以及如何失败。我主要关心的是函数foo。它似乎工作得很好,但这可能是内联或其他巧合的结果吗?如果我将其签名更改为void foo(const_um128&),该怎么办

非常感谢您的意见。多谢各位

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);
}
结构A { __m128 x; int n; }; void foo(uu m128); 空心钢筋(A); void f1() { //不会编译
//std::vector

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

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

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

typedef const MyVector& MyVectorParameter;

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

经常使用的resize()函数会导致所有对齐,也许您可以尝试专门为u m128指定向量模板?

您得到的编译错误/警告是什么?我假设类似于“形式参数……不会对齐”的内容这就是我得到的。错误C2719:“未命名参数”:带有_declspec(align('16'))的形式参数在x64中不会对齐,函数参数支持16字节对齐,所以这个问题消失了。我知道这并不能解决您眼前的问题,但是,嘿,这比什么都不做要好一些。;)结果是,按值传递_m128是可以的。按照web链接。什么类型的被破坏的编译器“支持”无法满足对齐要求的类型?将分配器帮助替换为std::vector,但std::vector仍然无法编译。是否检查了
sizeof(a)
?如果不是16字节的倍数,则矢量分配的阵列存储的后续元素将不会对齐,即使存储的开头已对齐。在我的平台上,a的大小为32字节。错误的对齐将导致运行时崩溃,但无论分配器如何,矢量都不会编译。