gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:21:35 27 4
gpt4 key购买 nike

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

编辑。即使使用对齐的分配器,STL 也会失败,因为传递值问题仍然存在。

找到此链接pass __m128 by value

最佳答案

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

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

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

typedef const MyVector& MyVectorParameter;

然后您可以在支持 vector 传值的平台上更改 typedef。

关于c++ - 对齐类型和按值传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4424741/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com