看看这个假设的头文件:
template <class T>
class HungryHippo {
public:
void ingest(const T& object);
private:
...
}
现在,HungryHippo<string>
您想要ingest
引用字符串是有道理的——复制字符串可能非常昂贵!但对于 aHungryHippo<int>
来说,它的意义不大。直接传递 anint
可能真的很便宜(大多数编译器会在寄存器中这样做),但是传递对 an 的引用int
是额外不必要的间接级别。这也适用于返回值。
有没有办法向编译器建议“嘿,我不打算修改参数,所以你决定是通过值还是通过引用传递,这取决于你认为什么更好”?
一些可能相关的事情:
- 我可以通过编写
template <class T, bool PassByValue> class HungryHippo
然后专注于PassByValue
. 如果我想变得非常花哨,我什至可以PassByValue
根据sizeof(T)
and来推断std::is_trivially_copyable<T>
。无论哪种方式,当实现看起来几乎相同时,这都是很多额外的工作,而且我怀疑编译器可以比我更好地决定是否通过值传递。 libc++项目似乎通过内联许多函数来解决这个问题,因此编译器可以向上一级做出选择,但在这种情况下,假设 的实现正如评论中所解释的,所有模板函数都是ingest
相当复杂,不值得内联。inline
默认的。