Contents
  1. 1. 不要复制函数的参数。应该通过值传递的方式让编译器来复制。
  • 1. 对vector排序。
  • 2.赋值运算符。(其实就是Copy-And-Swap-Idiom)
  • 通常我们在学习写C++程序的时候都听过这样的说法,作为函数的参数,应该引用传递pass by const refercence,这样不会有值传递引起拷贝问题,可以提高性能,但是Want Speed? Pass by Value这篇文章的标题就是想要提高性能吗?那就值传递吧。


    这篇文章讲了右值rvalue和返回值优化RVO,然后得出了原则:


    不要复制函数的参数。应该通过值传递的方式让编译器来复制。


    其实这并不是要颠覆我们以前说的值传递和引用传递的取舍,而是说,如果在我们的函数里面需要拷贝一份参数的话,那就不要通过传递引用,然后函数内部在调用拷贝构造的方式。而是应该直接用值传递的方式,这样编译器会有更大的空间来进行优化,提高性能。


    贴两个文章中举得例子吧。


    1. 对vector排序。


    下面的代码性能不好,因为显示的拷贝不能被编译器优化。

    1
    2
    3
    4
    5
    6
    7
    std::vector<std::string> 
    sorted(std::vector<std::string> const& names) // names passed by reference
    {
    std::vector<std::string> r(names); // and explicitly copied
    std::sort(r);
    return r;
    }

    下面的代码性能好,因为编译器可以用RVO优化,可以避免拷贝。而且就算编译器没有优化,最坏也就是和上面的代码一样,而且还少了一行,看起来更清楚一些。

    1
    2
    3
    4
    5
    6
    std::vector<std::string> 
    sorted(std::vector<std::string> names)
    {
    std::sort(names);
    return names;
    }

    2.赋值运算符。(其实就是Copy-And-Swap-Idiom)

    性能不好:

    1
    2
    3
    4
    5
    6
    T& T::operator=(T const& x) // x is a reference to the source
    {
    T tmp(x); // copy construction of tmp does the hard work
    swap(*this, tmp); // trade our resources for tmp's
    return *this; // our (old) resources get destroyed with tmp
    }

    性能好:

    1
    2
    3
    4
    5
    T& operator=(T x)    // x is a copy of the source; hard work already done
    {
    swap(*this, x); // trade our resources for x's
    return *this; // our (old) resources get destroyed with x
    }
    Contents
    1. 1. 不要复制函数的参数。应该通过值传递的方式让编译器来复制。
  • 1. 对vector排序。
  • 2.赋值运算符。(其实就是Copy-And-Swap-Idiom)