C++,想要提高性能,那就值传递(pass by value)吧。
通常我们在学习写C++程序的时候都听过这样的说法,作为函数的参数,应该引用传递pass by const refercence,这样不会有值传递引起拷贝问题,可以提高性能,但是Want Speed? Pass by Value这篇文章的标题就是想要提高性能吗?那就值传递吧。
这篇文章讲了右值rvalue和返回值优化RVO,然后得出了原则:
不要复制函数的参数。应该通过值传递的方式让编译器来复制。
其实这并不是要颠覆我们以前说的值传递和引用传递的取舍,而是说,如果在我们的函数里面需要拷贝一份参数的话,那就不要通过传递引用,然后函数内部在调用拷贝构造的方式。而是应该直接用值传递的方式,这样编译器会有更大的空间来进行优化,提高性能。
贴两个文章中举得例子吧。
1. 对vector排序。
下面的代码性能不好,因为显示的拷贝不能被编译器优化。
1 | std::vector<std::string> |
下面的代码性能好,因为编译器可以用RVO优化,可以避免拷贝。而且就算编译器没有优化,最坏也就是和上面的代码一样,而且还少了一行,看起来更清楚一些。
1 | std::vector<std::string> |
2.赋值运算符。(其实就是Copy-And-Swap-Idiom)
性能不好:
1 | T& T::operator=(T const& x) // x is a reference to the source |
性能好:
1 | T& operator=(T x) // x is a copy of the source; hard work already done |