这是Effective C++中第20个原则。
对于类对象而言,采用值传递是非常不明智的,因为它会涉及到COPY构造函数和析构函数的调用,如果你COPY的那个对象还包含了其他类的对象,那就会涉及到更多的函数调用,而且这是呈指数级增长的。而采用const&不仅极大地提高了效率而且还没有任何构造函数和析构函数的调用。而之所以采用const则是由于先前的原则3.
另外采用const&可以避免对象切割问题,虽然这个问题我还没认识到那么深刻。当一个子类对象采用值传递方式被调用,但是被调用时的类型要求是父类类型时,那么这时父类的COPY构造函数会被调用,不要以为这种情况不能发生,记住这正是多态的体现,而父类类型不过是个接口。这样做的话,该对象本身的子类特性就会被无视。
引用的底层是用指针来实现的,所以你会发现引用和指针的行为有些相仿。所以对于内置类型,如果你以值传递的话效率会高些,比如说VS中指针占4个字节,而一个char占1个字节。另外对于STL迭代器和函数,都被设计为采用以值传递,这是合理的,为什么呢,答案在原则1。
但是不能因为对象小就采用值传递,这是因为一方面对象虽小但牵连广泛,它所涉及的COPY构造函数和析构函数也不可小觑。另一方面,小对象也不排除将来因为需求的改变而变大的倾向。
原则20:宁以引用传递代替值传递
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 收集非原创文章,如遇原作者,请私聊我,我会表明出处! 1--10 1. C++中什么数据分配在栈或堆,静态存储区以...