输入参数传递:是否有有效传递值的大小阈值? C++中,当输入参数复制成本较低时(如 int > 浮点< /代码>等,通常只通过值传递。相反,输入的“观察到的”参数(例如,std::string)被传递给const&)

输入参数传递:是否有有效传递值的大小阈值? C++中,当输入参数复制成本较低时(如 int > 浮点< /代码>等,通常只通过值传递。相反,输入的“观察到的”参数(例如,std::string)被传递给const&),c++,parameter-passing,pass-by-value,C++,Parameter Passing,Pass By Value,我想知道像POD这样的类型,它表示具有int坐标的2D向量,例如 struct Vec2i { int X; int Y; }; 在32位MSVC编译器上,它只有8个字节(2*sizeof(int))。您是按值传递还是按常量传递 那么Vec2d具有double类型的坐标呢? (在MSVC上是2*sizeof(double),因此2*8=16字节。) 是否有一个“大小阈值”(例如16字节)用于放一行并说:“对于大小超过X的吊舱,通过常量和传递,对于较小的吊舱,通过值传递” PS

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

struct Vec2i
{
    int X;
    int Y;
};
在32位MSVC编译器上,它只有8个字节(
2*sizeof(int)
)。您是按值传递还是按常量传递

那么
Vec2d
具有
double
类型的坐标呢?
(在MSVC上是
2*sizeof(double)
,因此
2*8=16
字节。)

是否有一个“大小阈值”(例如16字节)用于放一行并说:“对于大小超过X的吊舱,通过
常量和
传递,对于较小的吊舱,通过值传递”


PS:请不要在回复中使用参数作为“过早优化”。

对我来说,这听起来像是
++it
it++
的对比(其中
it
是STL迭代器):这并不是说
++it
是过早的优化,关键是
it++
是过早的悲观:)

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

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


boost::call_traits
是一种尝试,试图找出通过引用传递
T
是否明智,但这并不完美。

+1表示过早悲观。如果你在意,请进行基准测试。跨体系结构没有通用的答案。@TonyD:我至少对x86和x64感兴趣;ARM也是一个很好的补充。我假设像您列出的
Vec2i
这样简单的POD没有明显的区别。@Mr.C64-如果有一个用户定义的复制构造函数需要很长时间,这不是更大的问题吗?您可以创建一个“小”类,该类的复制构造函数速度非常慢;也许你的意思是:“x64和ARM…”?