2

最近,我在阅读“c++ 的对象模型内部”,在阅读第 5 章时,我提出了以下问题:

即使类具有复制构造函数,编译器也会处理 NRVO 吗?

4

4 回答 4

3

答案是“不,它不会阻止它”。

n3290(C++11 草案),Book of 12,第 8 章,第 31 节(p284):

当满足某些条件时,允许实现省略类对象的复制/移动构造,即使对象的复制/移动构造函数和/或析构函数具有副作用。

于 2013-10-10T09:39:18.423 回答
2

RVO(或NRVO)是编译器可能用来删除副本的优化,即防止创建冗余副本。您的复制构造函数的自定义实现不能阻止应用此优化。

于 2013-10-10T09:33:48.967 回答
0

RVO 或多或少是在另一个范围内创建对象,并在读取或写入变量时使用该对象而不是本地对象。这会导致只创建一个对象而根本不调用复制 ctor,从而呈现您是否已声明它无关紧要。

于 2013-10-10T09:40:25.090 回答
0

我认为您的问题是“如果琐碎的复制构造函数会阻止 nrvo”,我的回答是否定的。我用《c++对象模型内幕》一书中的案例,让它打印foo函数和main函数中的成员地址,结果显示在release模式下是一样的,在debug模式下是不同的乐观,在 vs2010 中。这意味着 NRVO 并不关心您是否有一个非平凡的复制构造函数或一个平凡的复制构造函数。

于 2014-05-04T09:03:49.070 回答