21.以pass-by-refernce-to-const代替pass-by-value

前言

</br>
默认情况下c++以by value方式传递对象至函数。除非你另外指定,否则函数形参都是实参的副本,返回值也是一个副本。这些副本都由对象的copy构造函数生成,并同时需要析构。反复的构造与析构造就了大量的开销。


以pass-by-refernce-to-const代替pass-by-value的优势

效率

pass-by-refernce-to-const效率极高,因为没有任何构造、析构函数被调用。使用const则使用户不必担心传入的对象遭到任何更改。

避免slicing

当一个derived class对象以by value的方式传递给base class对象,base class的构造函数会被调用,而derived class的特性却被切割,导致最终得到的就是一个base class对象。
pass-by-refernce-to-const 不会导致上述问题,这是由于动态绑定的原因。


内置类型与pass-by—reference

</br>
在编译器的底层实现中,reference往往以指针的形式表现出来,因此pass-by-refernce手法实际上传递的是一个指针。如果你有一个对象是内置类型,那可能用pass-by-value的效率更高一些,stl的迭代器和函数对象也是pass-by-value的效率更高。


小型对象与pass-by-reference

</br>
有读者误以为内置类型使用pass-by_value效率更高,就应该对所有的小型对象使用pass-by-value.这种思想是错误的,对象小并不意味着copy构造函数不昂贵(比如复制该对象需要复制其所有指向的东西,详情可见Effective STL 15)。就算它真的不昂贵,你也不能保证它以后还是不昂贵(未来时态编程 More Effective C++ 32)�,甚至有的时候不同的编译器都会改变type的大小。


总结

  1. 尽量以pass-by-refernce-to-const代替pass-by-value,前者是高效且正确的代名词。
  2. 规则1并不适用于内置类型,以及stl的迭代器与函数对象。