c++ - 关于编译器NRV优化的问题
ringa_lee
ringa_lee 2017-04-17 11:44:35
[C++讨论组]

话说如果一个class没有提供copy constructor,就不会实施NRV优化,这是为什么,因为编译器需要的话,可以合成一个copy constructor啊

求大神解答, 谢谢。

ringa_lee
ringa_lee

ringa_lee

全部回复(2)
阿神

话说这个年代你就表纠结NRV优化了,直接用move constructor就好了。
表达式生成的临时对象都是rvalue,如果class有一个move constructor,比如:

class A {
public: A(A &&other) {... };
};

那么A(some_func_returns_a_object())会使用这个construtor,在这个constructor里你可以“破坏”other的内容,把需要的东西直接搬到this里面来。

黄舟

题目的这句话应该是从深度探索C++对象模型中看来的吧,其实NRV优化和有没有copy constructor并没有直接的联系。

“早期的 cfront需要一个开关来决定是否应该对代码实行NRV优化,这就是是否有客户(程序员)显式提供的拷贝构造函数:如 果客户没有显示提供拷贝构造函数,那么cfront认为客户对默认的逐位拷贝语义很满意,由于逐位拷贝本身就是很高效的,没必要再对其实施NRV优化;但 如果客户显式提供了拷贝构造函数,这说明客户由于某些原因(例如需要深拷贝等)摆脱了高效的逐位拷贝语义,其拷贝动作开销将增大,所以将应对其实施NRV 优化,其结果就是去掉并不必要的拷贝函数调用。”

参看上面的那段话,当然我也是从其他地方摘过来的,由于Lippman写这本书的时候比较早,并且他是cfront的早起作者之一,所以就想当然的把这句话当做准则写进书里面了。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号