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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 让自己习惯C++ 条款01:视C++为一个语言联邦 为了更好的理解C++,我们将C++分解为四个主要次语言:...
    Mr希灵阅读 7,845评论 0 13
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 13,144评论 1 51
  • C++文件 例:从文件income. in中读入收入直到文件结束,并将收入和税金输出到文件tax. out。 检查...
    SeanC52111阅读 7,885评论 0 3
  • 收集非原创文章,如遇原作者,请私聊我,我会表明出处! 1--10 1. C++中什么数据分配在栈或堆,静态存储区以...
    Juinjonn阅读 10,365评论 0 30
  • 三年前遇到她。 瘦瘦小小和一群狗混迹抢狗粮,虽然弱势身单力薄因为饿真的很拼。 那天,我儿女双全。 一只喵太孤单~于...
    赏心阅读 1,514评论 0 1