2

假设我有以下

struct A
{
    __m256 a;
}
struct B
{
    __m256 a;
    float b;
}

在硬核循环中,以下哪一项通常更好(如果有,为什么)?

void f0(A a) { ... }
void f1(A& a) { ... } //and the pointer variation
void f2(B b) { ...}
void f3(B& b) { ... } //and the pointer variation
4

1 回答 1

4

答案是没关系。

根据这个:

http://msdn.microsoft.com/en-us/library/ms235286.aspx

调用约定规定 16 字节(也可能是 32 字节)操作数始终通过引用传递。所以即使你通过值传递,编译器也会在下面通过引用传递它。

换句话说,XMM 和 YMM 寄存器在 Windows 中永远不会按值传递。但是 XMM0-4 的下半部分仍然可以用来按值传递 64 位参数。

编辑:

在您使用float值的第二个示例中,存在细微差别,因为它仍然会影响b是通过引用还是按值传递。

于 2011-10-21T17:08:39.247 回答