c++ - 当按值传递比通过 const 引用传递时的经验法则?

标签 c++ c++11 pass-by-reference pass-by-value

假设我有一个接受 T 类型参数的函数。 它不会改变它,所以我可以选择通过 const 引用 const T& 或值 T 传递它:

void foo(T t){ ... }
void foo(const T& t){ ... }

在通过 const 引用传递比通过值传递便宜之前,T 应该变成多大的经验法则?例如,假设我知道 sizeof(T) == 24。我应该使用 const 引用还是值?

我假设 T 的复制构造函数是微不足道的。否则,问题的答案当然取决于复制构造函数的复杂性。

我已经寻找过类似的问题,偶然发现了这个问题:

template pass by value or const reference or...?

但是,接受的答案( https://stackoverflow.com/a/4876937/1408611 ) 没有说明任何细节,它只是说明:

If you expect T always to be a numeric type or a type that is very cheap to copy, then you can take the argument by value.

所以它并没有解决我的问题,而是改写了它:一个类型必须有多小才能“复制起来非常便宜”?

最佳答案

如果您有理由怀疑会有值得的性能提升,请使用经验法则将其剔除并衡量。您引用的建议的目的是您不会无缘无故地复制大量数据,但也不要通过将所有内容都作为引用来危害优化。如果某些东西处于“复制明显便宜”和“复制明显昂贵”之间的边缘,那么您可以负担得起任何一种选择。如果您必须让您做出决定,请掷硬币。

如果一个类型没有时髦的复制构造函数并且它的 sizeof 很小,那么它的复制成本很低。 “小”没有最佳的硬数字,甚至在每个平台的基础上都没有,因为它在很大程度上取决于调用代码和函数本身。随你的直觉走吧。一、二、三个字很小。十个,谁知道呢。一个 4x4 的矩阵并不小。

关于c++ - 当按值传递比通过 const 引用传递时的经验法则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26387569/

相关文章:

c++ - 如何创建一个可以使用 std::unique_ptr 作为模板参数正常工作的容器?

C++ 引用和内存

javascript - NodeJS读取并生成SAS文件: xport and sas7bdat

c++ - JSONCPP 使用 Visual Studio 2010 构建

c++ - 如何将着色器中生成的 float 据(而非颜色)拉回到 CPU?

c++ - 使用 C++ 读取 1、8 或 24 位 BMP 文件

c++ - Outlook 加载项。如何管理项目事件

c++ - 如何将部分初始化的结构对象放入 vector 中?

foreach - 如何让 foreach 对委托(delegate)使用非引用类型?

c++ - 指针访问冲突