繁体   English   中英

NRV(命名返回值)复制构造函数

[英]NRV(named return value) copy-constructor

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

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

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

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

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

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

RVO或多或少地是在另一个作用域中创建对象,并在读取或写入变量时使用该对象而不是本地对象。 这将导致仅创建一个对象,而根本不会调用任何副本ctor,从而使您是否声明了它无关紧要。

我认为您的问题是“如果琐碎的复制构造函数会阻止nrvo”,我的回答是“否”。 我在“ c ++对象模型内部”一书中使用了这种情况,让它在foo函数和main函数中打印成员的地址,结果表明它们在发布模式下是相同的,而在调试模式下是不同的,而没有乐观,vs2010。 这意味着NRVO不在乎您是使用简单的副本构造函数还是使用简单的副本构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM