这篇记录的是模板参数的按值传递和按引用传递,这里就直接放大佬的结论了。
###模板参数声明的推荐
按值传递
- 数组和字符串会 decay。
- 性能问题(可以使用 std::ref 和 std::cref 来避免,但是要小心这么做是有效的)。
按引用传递
- 性能更好。
- 需要 forwarding references,并且注意此时模板参数为隐式的引用类型。
- 需要对参数是数组和字符串的情况额外关注。
###一般性建议
对应模板参数,一般建议如下:
默认情况下,使用按值传递。理由:
- 简单,尤其是对于参数是数组和字符串的情况。
- 对于小对象而言,性能也不错。调用者可以使用 std::ref 和 std::cref.
有如下理由时,使用按引用传递:
- 需要函数改变参数的值。
- 需要 perfect forwarding。
- 拷贝参数的性能不好。
如果你对自己的程序足够了解,当然可以不遵守上面的建议,但是不要仅凭直觉就对性能做评估。最好的方法是:测试。
不要将模板参数设计的太通用
比如你的模板函数只想接受 vector,那么完全可以定义成:
template<typename T>
void printVector (const std::vector<T>& v) {
...
}
这里就没有必要定义为const T& v.