[当标准函数不修改而接受模板化参数时,似乎总是采用const ref
(例如:std::vector::insert)。
这是否意味着bool
参数之类的函数将变为std::vector<bool>::insert(const bool& value)
?
或者是否有一些优化使其改为std::vector<bool>::insert(bool value)
?如果是,我自己的模板函数也会从中受益吗?
[std::vector
是模板,因此,根据定义,std::vector<bool>::insert()
是inline
。
[现代编译器可以轻松地“透视” inline
调用中的引用并将它们全部优化。
对于像int
这样的小对象,通过引用和按值传递之间没有区别。
示例:
struct A {
int func1(const int& x) { return x + 1; }
int func2(int y) { return y + 1; }
};
int func1(int x) {
A a;
return a.func1(x);
}
int func2(int y) {
A a;
return a.func2(y);
}
生成的代码(godbolt link):
func1(int): # @func1(int)
lea eax, [rdi + 1]
ret
func2(int): # @func2(int)
lea eax, [rdi + 1]
ret
如果您要通过共享库公开API,则then传递按引用可能会导致额外的取消引用。这是因为在C ++ ABI中,传递引用实际上是通过指针进行的。但是对于inline
调用,这通常不是问题。
另一方面,如果复制或使用对象带来副作用,则按值传递large对象可能不容易优化。因此,对于通用模板,通过引用传递是明智的设计选择。