首页 > 关于编译器NRV优化的问题

关于编译器NRV优化的问题

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

求大神解答, 谢谢。


话说这个年代你就表纠结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的早起作者之一,所以就想当然的把这句话当做准则写进书里面了。

【热门文章】
【热门文章】