假设我有以下
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
假设我有以下
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
答案是没关系。
根据这个:
http://msdn.microsoft.com/en-us/library/ms235286.aspx
调用约定规定 16 字节(也可能是 32 字节)操作数始终通过引用传递。所以即使你通过值传递,编译器也会在下面通过引用传递它。
换句话说,XMM 和 YMM 寄存器在 Windows 中永远不会按值传递。但是 XMM0-4 的下半部分仍然可以用来按值传递 64 位参数。
编辑:
在您使用float
值的第二个示例中,存在细微差别,因为它仍然会影响b
是通过引用还是按值传递。