原则20:宁以引用传递代替值传递

这是Effective C++中第20个原则。
对于类对象而言,采用值传递是非常不明智的,因为它会涉及到COPY构造函数和析构函数的调用,如果你COPY的那个对象还包含了其他类的对象,那就会涉及到更多的函数调用,而且这是呈指数级增长的。而采用const&不仅极大地提高了效率而且还没有任何构造函数和析构函数的调用。而之所以采用const则是由于先前的原则3.
另外采用const&可以避免对象切割问题,虽然这个问题我还没认识到那么深刻。当一个子类对象采用值传递方式被调用,但是被调用时的类型要求是父类类型时,那么这时父类的COPY构造函数会被调用,不要以为这种情况不能发生,记住这正是多态的体现,而父类类型不过是个接口。这样做的话,该对象本身的子类特性就会被无视。
引用的底层是用指针来实现的,所以你会发现引用和指针的行为有些相仿。所以对于内置类型,如果你以值传递的话效率会高些,比如说VS中指针占4个字节,而一个char占1个字节。另外对于STL迭代器和函数,都被设计为采用以值传递,这是合理的,为什么呢,答案在原则1。
但是不能因为对象小就采用值传递,这是因为一方面对象虽小但牵连广泛,它所涉及的COPY构造函数和析构函数也不可小觑。另一方面,小对象也不排除将来因为需求的改变而变大的倾向。

你可能感兴趣的:(原则20:宁以引用传递代替值传递)