C++ 传递包含SSE/AVX值的类型

C++ 传递包含SSE/AVX值的类型,c++,visual-c++,optimization,sse,avx,C++,Visual C++,Optimization,Sse,Avx,假设我有以下几点 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 varia

假设我有以下几点

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

答案是没关系

据此:

调用约定声明16字节(可能是32字节)操作数始终通过引用传递。因此,即使您希望通过值传递,编译器也会通过下面的引用传递它

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

编辑:


在第二个使用
float
值的示例中,有一点不同,因为它仍然会影响
b
是通过引用还是通过值传递。

可以通过val传递结构的一部分,通过ref传递部分?我认为必须通过ref(指向堆栈/堆的指针)或val(复制到堆栈)传递整个过程?从性能方面来说,主要部分是参数是通过堆栈还是通过寄存器传递。64位或更小的传递值参数由寄存器完成或复制到堆栈。(我不完全确定这是否也适用于结构,因为每个成员都可以被视为单独的参数。)通过引用传递参数通常是通过传递指向该参数的指针来完成的,这对于大于64位的所有参数都是必需的。所以我要说的是,无论您做什么,Windows中的寄存器永远不会传递XMM和YMM值。(除非你启用了IPO或者函数内联了什么的)谢谢我明白了。我不知道结构成员被有效地视为单独的参数(在传递值时)。