C++ 对齐类型和按值传递参数
通过值传递对齐类型或具有对齐类型的结构在某些实现中不起作用。这会破坏STL容器,因为某些方法(如resize)按值获取其参数 我使用VisualStudio2008运行了一些测试,但不完全确定“传递值”何时以及如何失败。我主要关心的是函数foo。它似乎工作得很好,但这可能是内联或其他巧合的结果吗?如果我将其签名更改为void foo(const_um128&),该怎么办 非常感谢您的意见。多谢各位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(
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字节。错误的对齐将导致运行时崩溃,但无论分配器如何,矢量都不会编译。