c++ - 关于编译器NRV优化的问题

 披着狼皮的卷毛羊万_784 发布于 2022-11-06 06:40

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

求大神解答, 谢谢。

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

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

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

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

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

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

    2022-11-10 23:36 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有