深度探索C++对象模型 9.1分
读书笔记 深度探索C++对象模型——NRV优化
惟以不永怀

网上有一份比较好的笔记,请参考《深度探索C++对象模型》笔记汇总 NRV优化 对于下列代码: C a, b; C c = add(a, b); 如果编译器未开启NRV优化,会生成如下东东: C __temp0; // 构造函数. add(__temp0, a, b); C c(__temp0); // 拷贝构造函数. 而开启NRV优化后,只会生成下列代码: add(c, a, b); 所谓的NRV优化,即保存返回值的变量不再使用编译器内部生成的__temp0这样的东西,而是直接把c作为返回变量 书中说,NRV优化和拷贝构造函数是有关系的,只有定义了拷贝构造函数才会开启NRV优化,但现代编译器NRV优化的开启一般都与拷贝构造函数没有关系,下面一段话摘自网络,参考关于cfront的NRV优化,解释了为什么lippman在书中说有关的原因: “早期的 cfront需要一个开关来决定是否应该对代码实行NRV优化,这就是是否有客户(程序员)显式提供的拷贝构造函数:如 果客户没有显示提供拷贝构造函数,那么cfront认为客户对默认的逐位拷贝语义很满意,由于逐位拷贝本身就是很高效的,没必要再对其实施NRV优化;但 如果客户显式提供了拷贝构造函数,这说明客户由于某些原因(例如需要深拷贝等)摆脱了高效的逐位拷贝语义,其拷贝动作开销将增大,所以将应对其实施NRV 优化,其结果就是去掉并不必要的拷贝函数调用。” 需要说明的一点:NRV优化会导致原本预想中的调用“拷贝构造函数”变成调用别的“构造函数”,一旦这个时候,拷贝构造函数和别的构造函数提供的功能不同,就可能会出问题。 另一个解释如下: 如果程式没有 explicit copy constructor,编译器会自动为我们做出来(如为 trivial,则直接 bitwise copy;如为 nontrivial,则由编译器为我们合成出一个 copy constructor)。因此,有没有 explicitcopy constructor 并不影响 NRV 最佳化的实施。NRV 最佳化主要是 由编译器 option 来决定要不要实施。

6
《深度探索C++对象模型》的全部笔记 32篇
豆瓣
免费下载 iOS / Android 版客户端