在查看std::move是否有必要在return localvar 中使用的时候,查看到了RVO和NRVO,因为std::move总是会调用移动构造函数所以会增加一次构造。

关于RVO和NRVO

RVO (return value optimization) 和NRVO (named return value optimization) 是C++在处理 “返回一个class object的函数” 时常用的优化技术,主要作用就是消除临时对象的构造和析构成本

经过测试,gcc编译器在debug和release模式下均支持NRVO,VS在debug模式下不支持NRVO,仅支持RVO,而在release模式下也支持NRVO

参考文章 蓝大@蓝色的这篇文章

RVO V.S. std::move 讲解的很到位。

C++的拷贝构造函数的调用时机? - Skillness 的回答

Return value optimization 维基百科

首先,关于C++标准中的这段话,在copy elision中找到的关于RVO的描述如下

  • When a nameless temporary, not bound to any references, would be moved or copied into an object of the same type (ignoring top-level cv-qualification), the copy/move is omitted. When that temporary is constructed, it is constructed directly in the storage where it would otherwise be moved or copied to. When the nameless temporary is the argument of a return statement, this variant of copy elision is known as RVO, "return value optimization".

翻译一下:

当一个未命名且未绑定到任何引用的临时变量被移动或复制到一个相同的对象时,拷贝和移动构造可以被省略。当这个临时对象在被构造的时候,他会直接被构造在将要拷贝/移动到的对象。当未命名临时对象是函数返回值时,发生的省略拷贝的行为被称为RVO,"返回值优化"。

代码:

#include <iostream>
using namespace std;
struct C {C() { std::cout << "A Construct.\n"; }~C(){ std::cout << "A DisConstruct.\n"; }C(const C&) { std::cout << "A copy was made.\n"; }//C(C&&) { std::cout << "A move was made.\n"; }
};
template<typename T>
T f() {T c;//return std::move(c);return c;
}
int main() {std::cout << "Hello World!\n";C obj = f<C>();//f<C>();return 0;
}

在vs debug(RVO)中输出:

在vs release中输出:

在linux g++下输出

不使用RVO和NRVO的结果:

那么RVO编译器是怎么优化的呢

T f() {T c;return c;
}void f(T& _c) {T c;_c.T::T(c);//拷贝构造调用return ;
}
主函数:C obj = f<C>();
C obj;//定义而不构造
(f<C>(obj),obj);

显然如果调用方式为f<C>(),不赋值的话RVO没有用

而NRVO的优化,即直接用临时对象的引用替换了原本的返回变量,并在函数体内调用普通构造函数进行构造

void f(T& _c) {_c.T::T();//优化拷贝构造return ;
}

c++ RVO 和 NRVO相关推荐

  1. 【C++ 语言】面向对象 ( 函数重载 | 运算符重载 | 运算符重载两种定义方式 | 拷贝构造方法 | RVO 优化 | NRVO 优化 )

    文章目录 函数重载 运算符重载 ( 类内部定义云算符重载 ) 运算符重载 ( 类外部定义运算符重载 ) 可重载的运算符 拷贝构造方法 编译器优化 ( RVO 优化 | NRVO 优化 ) 完整代码示例 ...

  2. C++中的RVO、NRVO与Copy Elision

    RVO: Return Value Optimization NRVO: Named Return Value Optimization RVO 和 NRVO 自C++98时代就已存在,即当函数按值返 ...

  3. 编译器优化RVO和NRVO

    文章目录 编译器选择 RVO/NRVO 不执行RVO和NRVO优化 只执行RVO优化 只进行NRVO优化 进行RVO和NRVO优化 哪些情况RVO/NRVO优化不执行 参考资料 编译器选择   如果想 ...

  4. C++高阶 返回值优化--RVO和NRVO介绍

    RVO即返回值优化(return value optimize),可以少做一次拷贝构造. NRVO是具名返回值的意思,起初RVO技术仅支持匿名变量的优化,后期才加入对具名变量的优化. RVO: Big ...

  5. C++中的RVO和NRVO

    RVO (return value optimization) 和NRVO (named return value optimization) 是C++在处理 "返回一个class obje ...

  6. c++中返回值优化(RVO)和命名返回值优化(NRVO)介绍

    RVO和NRVO介绍 前言 半年前就想写一篇关于RVO和NRVO的介绍,但碍于没什么时间去写博客.在跟身边人进行学术探讨的时候,会发现部分人可能尝到了编译器给它做返回值优化的好处,知道这段代码被优化了 ...

  7. C++内存管理全景指南

    导语 深入理解C++内存管理,一文了解所有C++内存问题,万字长文,建议收藏 随着人工智能,云计算等技术的迅猛发展,让Python,go等新兴语言流行了起来,很多人以为C++可能已经过时了,确实,C+ ...

  8. 深入理解C++内存管理

    深入理解C++内存管理 一文了解所有C++内存的问题 AlexCool 目录 一  C++内存模型 二  C++对象内存模型 三 C++程序运行内存空间模型 四  C++栈内存空间模型 五 C++堆内 ...

  9. 史上最全的C++/游戏开发面试问题总结(一)——C++基础

    笔者毕业两年,最近通过猎头拿到了腾讯IEG以及网易游戏的两个客户端研发offer(UE4/C++).在面试前夕,笔者对C++进行了较为全面的复习和总结,乐观估计可以涵盖80%左右的面试基础问题. 这个 ...

最新文章

  1. 基于easyui开发Web版Activiti流程定制器详解(五)——Draw2d详解(一)
  2. docker-compose常用命令
  3. 朴素贝叶斯Naïve Bayes分类算法在Hadoop上的实现
  4. Django中一个项目使用多个数据库(原生sql 的使用,亲测)
  5. [css] 举例说明如何从html元素继承box-sizing?
  6. Cordova自定义插件
  7. 谷歌浏览器修复工具_奇安信代码卫士协助谷歌修复漏洞 获官方致谢
  8. 【POI 2007】Ridges and Valleys山峰和山谷(GRZ)
  9. OpenJDK8编译之后,缺少com.sun.tools.javac.Main怎么办
  10. DSP学习笔记(三)——TMS320F28335硬件结构
  11. 电脑删除的文件去哪了?删除的数据恢复,居然有3个方法…
  12. android 桌面快捷方式静态shortcuts异常
  13. ResNet残差网络——Deep Residual Learning for image recongnition
  14. 关于火星坐标、偏移、加偏和纠偏、无偏的理解
  15. 腾讯T3手把手教你!Flutter尽然还能有这种操作!全套教学资料
  16. 常耀俊老师经典《非人力资源经理的人力资源管理》课程
  17. win10系统连接wifi后可以上网但是显示【无Internet,安全】解决 and Maple初始化失败问题
  18. Hive的JavaAPI操作
  19. 创联群控系统实时投屏一人操作N台手机
  20. Snapchat高管解读财报 公司不做任何短期业绩指引

热门文章

  1. ASPCMS常用标签
  2. Controller 的方法使用String接收参数的好处
  3. Understanding Docker Container Exit Codes
  4. ios底部栏设计规范_iOS和Android的UI设计规范有啥区别?
  5. 浅出Freebsd的Fontconfig
  6. arthas 复制粘贴快捷键
  7. 现在转行软件测试来得及吗?前景怎样
  8. 盛迈坤电商:拼多多店铺要注意运营维护
  9. 分析在线生成模板、导入、导出
  10. 全球免费软件推荐(国外篇) 1