输入参数传递:是否存在有效传值的大小阈值?

Mr.*_*C64 9 c++ parameter-passing pass-by-value

在C++中,当输入参数是便宜的复制(例如像一个int,float等等),它通常是简单地通过由值.相反,输入复制(例如std::string)不便宜的"观察"参数const &.

我想知道像POD这样的类型代表具有int坐标的2D矢量,例如

struct Vec2i
{
    int X;
    int Y;
};
Run Code Online (Sandbox Code Playgroud)

在32位MSVC编译器上,它只有8个字节(2 * sizeof(int)).你会通过价值还是通过const &

那个Vec2ddouble型坐标怎么样?
(在MSVC上,它将是2 * sizeof(double),所以2 * 8 = 16字节.)

是否存在"大小阈值"(例如16个字节?)用于放置一条线并说:"对于大小为X的const &POD经过,对于较小的POD经过值"


PS:请不要在回复中使用参数作为"过早优化".
这对我来说听起来像的情况下,++itit++(其中it是一个STL迭代器):这并不是说++it是一个不成熟的优化,问题是,it++过早pessimization :)

MSa*_*ers 1

在幕后,一个驱动因素是是否可以在一个或多个寄存器中传递变量。在 20 世纪,当参数类型直接映射到寄存器时,编译器做得相当好。传递一个寄存器对中包含两个成员的结构是 21 世纪的优化。

正如您在评论中提到 x86 那样,这是一个特殊情况。它缺乏寄存器,并且可能没有可用于参数传递的寄存器对。x86 和 ARM 在这方面都要好得多,这也是 x64 通常更快、ARM 更省电的原因之一

boost::call_traits<T>试图弄清楚T通过引用传递是否明智,但它并不完美。