最近,我正在阅读“在c ++的对象模型中”,而在阅读第5章时,我提出了以下问题:
即使类有复制构造函数,编译器也会处理NRVO吗?
答案 0 :(得分:3)
答案是“不,它不会阻止它。”
n3290(C ++ 11 draft),12册,第8章,第31节(p284):
当满足某些条件时,允许实现省略类的复制/移动构造 对象,即使对象的复制/移动构造函数和/或析构函数有副作用。
答案 1 :(得分:2)
RVO(或NRVO)是编译器可能用于删除副本的优化,即防止创建冗余副本。您的复制构造函数的自定义实现无法阻止应用此优化。
答案 2 :(得分:0)
RVO或多或少地在另一个范围内创建对象,并在读取或写入变量时使用该对象而不是本地对象。这导致只创建一个对象,并且根本不会调用任何复制ctor,从而呈现您是否已将其声明为无关。
答案 3 :(得分:0)
我认为你的问题是“如果琐碎的拷贝构造函数会阻止nrvo”, 我的回答是否定的。 我在书中使用“c ++对象模型内部”中的情况,让它在foo函数和main函数中打印成员的地址,结果表明它们在发布模式下是相同的,而在调试模式下不同乐观,在vs2010。 这意味着NRVO并不关心你是否有一个重要的复制构造函数或一个微不足道的复制构造函数。