首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏程序员的园——原创文章

    浅析RVO

    NRVO(Named Return Value Optimization,命名返回值优化)是RVO的一种特殊情况,隶属于RVO范畴。 如下的代码分别是RVO和NRVO的使用示例。 RVO的原理为当编译器检测到适用于RVO的情况时,在编译源代码时就会进行优化。这意味着编译器会检测适用情况,同理,RVO必定存在其不适用的场景——其使用限制,接下来会详述其使用限制。 使用限制 1. 函数中不能有其他返回值 如下的示例代码中,依据条件,会有相同类型但是不同值的返回值——即含有其他的返回值,gcc中并没有rvo,依次执行了构造-移动构造-析构,但是msvc下发生了rvo。 当然还有的书籍讲“函数返回的对象被其他对象引用”也会限制RVO,形如如下的代码。但是经过测试gcc和msvc中均进行了RVO,即未限制RVO,但是仍不排除部分版本的编译器会进行限制。 由于RVO(NRVO作为RVO的特例)是在编译期进行,所以具体的行为依赖于编译器,不同的编译器会有不同的行为,乃至于不同版本的编译器也会有不同的行为,为了写出通用性强的代码,请牢记可能会限制RVO的使用场景

    55210编辑于 2024-07-18
  • 来自专栏Andromeda的专栏

    浅谈RVO与NRVO

    RVO 和 NRVO RVO(Return Value Optimization,返回值优化)和 NRVO(Named Return Value Optimization,命名返回值优化)是编译器进行的优化技术 无优化 如果没有返回值优化(RVO)或命名返回值优化(NRVO),那么一个函数返回临时对象的一般步骤如下: 在函数内部创建临时对象。 在函数返回之前,分配内存来存储函数的返回值。 RVO RVO 是一种编译器优化技术,它避免了从函数返回时创建临时对象。 当函数返回一个临时对象(通常是由构造函数直接初始化的匿名对象)时,RVO 允许编译器省略创建和销毁临时对象的过程,而是直接在接收对象的位置构造返回值。这样可以避免不必要的拷贝开销。 NRVO NRVO 与 RVO 类似,但适用于返回函数内部已命名的局部变量。编译器优化这个过程,允许在调用者的栈帧上直接构造局部变量,避免了将局部变量拷贝到返回值的过程。

    54910编辑于 2024-03-13
  • 来自专栏Andromeda的专栏

    浅谈RVO与NRVO

    RVO 和 NRVO RVO(Return Value Optimization,返回值优化)和 NRVO(Named Return Value Optimization,命名返回值优化)是编译器进行的优化技术 无优化 如果没有返回值优化(RVO)或命名返回值优化(NRVO),那么一个函数返回临时对象的一般步骤如下: 在函数内部创建临时对象。 在函数返回之前,分配内存来存储函数的返回值。 RVO RVO 是一种编译器优化技术,它避免了从函数返回时创建临时对象。 当函数返回一个临时对象(通常是由构造函数直接初始化的匿名对象)时,RVO 允许编译器省略创建和销毁临时对象的过程,而是直接在接收对象的位置构造返回值。这样可以避免不必要的拷贝开销。 NRVO NRVO 与 RVO 类似,但适用于返回函数内部已命名的局部变量。编译器优化这个过程,允许在调用者的栈帧上直接构造局部变量,避免了将局部变量拷贝到返回值的过程。

    46310编辑于 2024-07-27
  • 来自专栏c++11

    rvo(copy_elision)总结

    C ++ 98/03标准不需要编译器提供RVO优化,但是大多数流行的C ++编译器都包含此优化技术 RVO使用 #include <iostream> using namespace std; class //~localObj RVO原理 图片来自: RVO VS std :: move no rvo [7446a02d-31c5-48ec-8544-56411141f7d7.png] rvo [5ce3d183 总结 rvo可以减少对象拷贝,不调用构造函数生成临时对象,而是直接使用原来的对象,提升性能 可以禁用rvo -fno-elide-constructor 函数内的局部变量(必须直接返回同类型的变量名或匿名 是很早就出现的技术,copy elision是c++11后基于rvo提出的 在满足rvo的条件下,会优先考虑move函数然后才是copy函数,这并不冲突,如果加了-fno-elide-constructor 导致rvo失效,那么就能看到move函数被调用而不是copy函数。

    1.2K30发布于 2020-07-07
  • 来自专栏智能大石头

    C++返回值优化RVO

    RVO = return value optimization。 这个就是C++的RVO,返回值优化技术,没想到MDK也支持。 这个技能的获取,让我C++水平从30%提升到40%

    1.5K90发布于 2018-01-09
  • 来自专栏java大数据

    给出一个n-tier(层)架构实例,HelloWord例子?

    request.getParameter("name"); String age = request.getParameter("age"); RegisterVO rVO =new RegisterVO(); rVO.setName(name); rVO.setAge(age); UserServiceMark_to_win us=new UserServiceMark_to_win(); try { us.register(rVO); } catch (Exception ) throws Exception { RegisterDTO regiDTO=new RegisterDTO(); regiDTO.setName(rVO.getName ()); regiDTO.setAge(rVO.getAge()); UserFrontBO ufb= new UserFrontBO(); ufb.register

    34710发布于 2021-07-14
  • 来自专栏技术随笔心得

    编译器之返回值优化

    在此需要说明的是,因为自C++11起才引入了NRVO,而NRVO针对的是具名函数对象返回,而C++11之前的RVO相对NRVO来说,是一种URVO(未具名返回值优化) RVO RVO(Return Value 当未命名临时对象是函数返回值时,发生的省略拷贝的行为被称为RVO(返回值优化)。 RVO优化针对的是返回一个未具名对象,也就是说RVO的功能是消除函数返回时创建的临时对象。 这是因为NRVO相比于RVO,是一种要求更为严格的优化方式,编译器启用NRVO的前提条件是返回值是具名的,但并不能说一段代码可以NRVO就不能RVO。 本节的内容,均是对于<<深度探索C++对象模型>>的理解,如果有误,请私信或者在评论区讨论 RVO原理 RVO优化的原理是消除函数返回时产生的一次临时对象。 虽然经过RVO优化后,性能有了部分提升,但是仍然存在一次拷贝构造,那么,在哪种场景下,RVO能够彻底优化呢?

    1.7K20编辑于 2022-08-25
  • 来自专栏学西

    【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略

    读者须知 RVO 与 NRVO 的启用条件 虽然 RVO 和 NRVO 是编译器自动完成的优化,但是这些优化并不总是启用,具体取决于编译器的实现和配置。 例如: 在 C++17 之前,RVO 是一个可选优化,但在 C++17 标准之后,RVO 被强制启用,编译器必须在符合条件的情况下执行拷贝省略。 返回值优化(RVO) 2.1 RVO 的概念 返回值优化(RVO) 是编译器的一种优化技术,它允许编译器在函数返回临时对象时, 直接在调用者的内存空间中构造该对象,避免不必要的拷贝或移动构造。 2.3.3 激进 RVO 的情况(Visual Studio 2022) Visual Studio 2022 实现了更加激进的 RVO 优化。 2.4 小结 RVO 主要用于返回临时对象的优化,能够在返回局部对象时避免多次拷贝。 Visual Studio 2019 中启用了 RVO,减少了临时对象的创建,但仍会调用一次拷贝构造。

    79810编辑于 2024-10-09
  • 来自专栏后台公论

    C++按值返回对象那些事

    即便是C++98,编译器其实也对此有NRVO、RVO的优化,避免拷贝,只要你不去主动关闭优化,基本都能享受到。 类似的问题在StackOverflow上早有讨论。 /stackoverflow.com/questions/4986673/c11-rvalues-and-move-semantics-confusion-return-statement NRVO、RVO 而在C++11之前有RVO(返回值优化)或NRVO(具名返回值优化),C++11以后也同样存在。都能提高C++函数返回时的效率,减少冗余的拷贝。 另外提一句什么是RVO呢?如果是返回没有名字的匿名对象,编译器对其做同样的优化就是RVO。 g++ rvo.cpp -std=c++98 -fno-elide-constructors -o 98.out g++ rvo.cpp -std=c++11 -fno-elide-constructors

    1.3K10编辑于 2021-12-08
  • 来自专栏大数据

    C++一分钟之-返回值优化与Move Semantics

    在C++编程中,返回值优化(Return Value Optimization, RVO)与移动语义(Move Semantics)是提高程序效率、减少不必要的对象复制的重要机制。 返回值优化(RVO) 基本概念 返回值优化是一种编译器优化技术,用于消除临时对象的创建和销毁。 常见问题与避免 过度依赖:RVO虽好,但并非所有编译器在所有情况下都能实施此优化。 避免策略:编写代码时保持简洁,尽量让编译器有机会应用RVO;同时,了解并使用C++11引入的移动语义作为补充。 实战代码示例 RVO示例 class MyClass { public: MyClass() { std::cout << "Constructor" << std::endl; } ~ ) { std::cout << "Destructor" << std::endl; } }; MyClass createObject() { return MyClass(); // RVO

    74810编辑于 2024-06-21
  • 来自专栏编程小王

    【C++篇】类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略

    读者须知 RVO 与NRVO的启用条件 虽然 RVO 和 NRVO 是编译器自动完成的优化,但是这些优化并不总是启用,具体取决于编译器的实现和配置。 在 C++17 之前,RVO 是一个可选优化,但在 C++17 标准之后,RVO 被强制启用,编译器必须在符合条件的情况下执行拷贝省略。 返回值优化(RVO) 2.1 RVO 的概念 返回值优化(RVO) 是编译器的一种优化技术,它允许编译器在函数返回临时对象时, 直接在调用者的内存空间中构造该对象,避免不必要的拷贝或移动构造。 2.3.3 激进 RVO 的情况(Visual Studio 2022) Visual Studio 2022 实现了更加激进的 RVO 优化。 2.4 小结 RVO 主要用于返回临时对象的优化,能够在返回局部对象时避免多次拷贝。 Visual Studio 2019 中启用了 RVO,减少了临时对象的创建,但仍会调用一次拷贝构造。

    58110编辑于 2024-11-20
  • 来自专栏the big bang of theory

    C++右值引用小说明

    不过最近在函数返回临时对象的case下发现一些不同: 有一条原则是在NRVO时候,如果函数体内存在不同的分支返回不同的变量 如if x return a; else return b; 则RVO失效,试验了下有下面的结果 (用常见的string实验): 1.在linux下RVO正常 (tlinux 2.2 )。 2.在windows(vs2015)下情况就有点特殊:只在第一个return使用了RVO,后面的return并没有 PS:本人以前研究底层的汇编的原因,所以比较喜欢看原理,从汇编角度看RVO的实现原理 其实是编译器偷偷的把外部返回值接收者的变量的地址做为一个隐藏参数传进了函数,这就为RVO提供了充分的可能条件。

    1.5K30发布于 2019-03-28
  • 来自专栏JokerDJ

    SpringBoot统一返回R类

    message) { this.message = message; return this; } } 编写R.java 泛型 package com.dj.rvo.Vo this.message = message; return this; } } 编写返回枚举 RHttpStatusEnum package com.dj.rvo.Vo ; import com.dj.rvo.Utils.JsonUtil; import com.dj.rvo.Vo.R; import com.fasterxml.jackson.databind.ObjectMapper ; import com.dj.rvo.Vo.RHttpStatusEnum; /** * * 功能描述: 异常返回 * * @param: * @return: * @auther: Joker ; import com.dj.rvo.Vo.RHttpStatusEnum; /** * * 功能描述: * * @param: * @return: * @auther: Joker

    65410编辑于 2023-11-27
  • 面试高频考点:传值返回和传引用返回的区别

    传值返回(非优化版本,强制拷贝构造) Date func() { Date d1; Date d2; if (time(0) % 2) { return d1; // 编译器无法预测 取消RVO ───────┘ 析构: 1️⃣ 局部 d 析构(离开 func) 2️⃣ 返回值临时析构(ref 生命周期结束) 可能还有: 3️⃣ 有的编译器生成额外延续临时,也会析构 C++ 值返回需要拷贝,RVO 返回结果和内部对象没必要共享(调用者想要自己的拷贝) 【常见例子】 操作符重载(比如 operator+) 工厂函数(生成新对象) 普通函数局部变量返回 想要触发拷贝/移动构造(可由 RVO 优化掉) 【优点】 不会有悬空引用/指针 生命周期安全,C++ 会自动管理临时对象 编译器可做 RVO/NRVO 优化 【示例】 Date AddDays(int n) { 另外现代编译器对值返回会做 RVO 优化,很多时候根本不会产生拷贝开销。

    14510编辑于 2025-12-18
  • 来自专栏C++ 动态新闻推送

    C++ 动态新闻推送 第3期

    ,请提交 issue ---- 资讯 编译器信息最新动态推荐关注hellogcc公众号 本周周报github直达 文章 Escape analysis hates copy elision 正常来说有RVO 优化 return std::move(s);属于非常多余的动作,会禁止RVO 但是某些场景下,RVO可能有害,也就是逃逸分析(Escape analysis) 作者举了个例子,这个代码段https:/ /godbolt.org/z/jG7x5h 解释了编译器如何分析逃逸,以及这种场景下,无法RVO优化,所以RVO的汇编反而比禁止的要好 也解释了为什么gcc和clang效果不同 -> 在g++中 (x) 默认表示禁止RVO,这是一个坑 SO 这篇文章还列了相关的提案,以及自己的建议PATCH,非常建议阅读,对于语言律师识别坑有帮助 Concise Result Extraction in Modern

    45020发布于 2021-08-31
  • 来自专栏C / C++

    C++引用专题(上):详解C++传值返回和传引用返回

    vector<int> generateNumbers() { std::vector<int> nums {1, 2, 3, 4, 5}; return nums; // 返回拷贝(可能被RVO 优化) } 3、底层工作原理 函数内部创建要返回的对象 将该对象拷贝到调用方的接收位置(可能被编译器优化) 函数栈帧销毁,局部变量被清理 4、编译器优化(RVO/NRVO) RVO 对象别名 拷贝开销 可能有(但常被优化) 无 修改原对象 不能 可以(非const引用) 安全性 高 需注意生命周期 适用对象大小 小型对象 中大型对象 典型用例 工厂函数、计算函数 访问器、链式调用 RVO 不适用 四、C++实践 1、默认优先使用传值返回: // 现代C++编译器能很好优化 std::vector<int> getData() { return {1, 2, 3}; // 依赖RVO

    29110编辑于 2025-11-13
  • 来自专栏程序员

    深入C++对象生命周期:从构造到析构的奥秘

    三、编译器的魔法:返回值优化(RVO/NRVO)考虑一个“昂贵”的类和一个创建它的函数:收起代码语言:C++运行AI代码解释ExpensiveObjectcreateExpensive(){ExpensiveObjectobj 但编译器会施展名为返回值优化(ReturnValueOptimization,RVO)的魔法来消除这些不必要的拷贝。 RVO/NRVO允许编译器直接在函数调用者(main函数中eo对象)的内存位置上构造本应在函数内部返回的对象。 RVO:适用于返回匿名临时对象(如returnExpensiveObject();)。NRVO:适用于返回有名字的局部对象(如上面的returnobj;)。 编译器的RVO/NRVO优化默默消除了价值昂贵的拷贝,让你可以更直观地编写代码而不牺牲性能。在生命终结时,析构函数必须小心翼翼地处理资源,并遵守“绝不抛出异常”的铁律,与异常机制安全共舞。

    25100编辑于 2025-09-16
  • 来自专栏17的博客分享

    类和对象(万字总结!深度总结了类的相关知识)(下)

    返回值优化:在函数返回值时,匿名对象与返回值优化(RVO)结合,能有效减少拷贝。 以下是几种主要的优化技术: 返回值优化(RVORVO 是一种编译器优化,它避免了在函数返回时临时对象的拷贝构造。编译器在函数返回时直接在目标位置创建对象,消除了拷贝的开销。 A(const A&) { std::cout << "Copy Constructor" << std::endl; } }; A createA() { return A(); // RVO ,避免拷贝 } int main() { A a = createA(); // RVO 使得没有调用拷贝构造函数 } 移动语义 C++11 引入了移动语义,通过移动构造函数和移动赋值运算符,

    31510编辑于 2024-10-16
  • 来自专栏学西

    类和对象下

    这种优化称为返回值优化(RVO)。 总结 匿名对象是没有名字的临时对象,生命周期非常短暂,通常用于一次性操作,如临时调用成员函数或返回值。 命名返回值优化(Named Return Value Optimization, NRVO):与RVO类似,NRVO会优化命名的局部对象的返回,避免不必要的拷贝。 7.3.2 返回值优化(RVO) 在 f2 函数中,返回局部对象 aa。理论上应调用拷贝构造函数,但编译器可以通过 RVO 优化,直接在调用者的内存中构造对象 aa2,避免多次构造与析构。 没有优化时的流程: 启用RVO优化后的流程: 总结 通过编译器优化,如拷贝省略、RVO 和 NRVO,现代C++编译器可以大幅提升对象拷贝的效率,减少多余的构造和析构操作。 你可以通过查阅 cppreference的RVO文档 进一步了解这些机制【链接】。

    56610编辑于 2025-02-21
  • 来自专栏C / C++

    C++引用专题(下):传值返回 VS 传引用返回

    BigData b2 = b1.moveFrom(); // 移动构造 } 三、最佳实践指南 1、优先传值返回: 返回局部变量或临时对象时 当需要独立副本时 现代C++的返回值优化(RVO getConfigValue() const { static std::string value = loadConfig(); return value; } 5、返回值优化(RVO duration1.count() << " μs\n"; std::cout << "By ref: " << duration2.count() << " μs\n"; } 注意:由于RVO

    20610编辑于 2025-11-13
领券