【发布时间】:2014-12-10 19:50:10
【问题描述】:
假设我有一个接受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 ) 没有说明任何细节,它只是说明:
如果您希望 T 始终是数字类型或非常 复制成本低,那么您可以按值获取参数。
所以它并没有解决我的问题,而是改写了它:一个类型必须多小才能“复制起来非常便宜”?
【问题讨论】:
-
@TheOne 一点也不。您必须考虑通过您获得的指针加载您使用的参数部分的成本。这很快就会变得混乱,所以最好的方法是尝试一下。但是例如,如果您的唯一参数是两个整数的 POD 对,则按值传递可能(取决于 ABI)只使用两个寄存器,而按指针传递会浪费可用的寄存器,并且需要函数内部的额外指令。
-
sizeof(std::vector<int>)在某些 32 位实现中为 12,在某些 64 位实现中为 24,但您不想按值传递它,因为 contents 可能更多不仅如此,即使不是这种情况,复制构造也需要为任何非空向量分配内存...另一方面,这在很大程度上取决于您所针对的平台,您应该查看 ABI 以了解函数调用是如何实现的。 -
相关阅读:Want speed? Pass by value. 当然还有谷歌搜索标题以阅读该文章的所有支持点和对立点。
-
@Angew 一篇不错的文章,但它专门讨论了您需要副本的情况(因为您要对其进行变异)。
-
@DavidRodríguez-dribeas:我指定我假设一个微不足道的复制构造函数。
std::vector当然是一个非常普通的复制构造函数的例子,所以我什至不会考虑复制vector,除非我真的需要一个副本。
标签: c++ c++11 pass-by-reference pass-by-value