编译器构造函数优化(NRV 优化)
NRV优化
NRV优化指发生在 函数以值返回时的拷贝构造的优化。如下这个demo,函数以值函数会发生拷贝构造,但是某些场景这个拷贝构造可以被省去。
class T {
};
T Fun();
如下面这个场景发生了俩个构造,一个是默认构造函数构造出了ret,一个ret构造出了返回的临时对象。
class T {public:T(){}T(const& T) {}};T Func() {T ret;return ret;}
但是支持NRV优化的编译器会进行如下优化,也就是说它会优化掉copy构造
T Func() {T ret;// 处理ret return ret;}该 ret 编译器会自动定义一个临时变量temp 传进来。void Func(T& ret) {ret.T::T(); // 调用T类型的默认构造函数//处理retreturn ret;}
NRV条件
1.返回值必须是一个具体的变量(有变量名)
2.必须有显示的构造函数
指定构造函数优化以值返回的copy构造
理论上下面这个列子,根据实现1 需要一个默认构造和一个copy构造,但是经过我们写出具体的 以 x,y 为参数的构造函数,编译器优化后 该函数返回值直接由指定构造函数来构造出来。
实现1
X bar(const T& x, const T& y) {X xx;计算x,y return xx;
}
实现2
X bar(const T& x, const T& y) {return X(y,z);
}
实现2 优化成为
void bar(const T& x, const T& y, const X& ret) {ret.X::X(x,y);
}
不指定构造函数
如果类成员全是内置类型,并且编译器也不会合成copy构造时,当copy时进行 bitwise Copy(按位逐次copy,也就是按每一位成员变量进行赋值)。这样没有栈帧的开销,所以是否指定copy构造函数(为了NRV优化时,我们显示指定),得看实际情况。
编译器构造函数优化(NRV 优化)相关推荐
- 拷贝构造函数与NRV优化
<深度探索C++对象模型>第二章67页有: 这个程序的第一个版本不能实施NRV优化,因为test class 缺少一个copy constructor. 也就是缺少拷贝构造函数所以不能 ...
- C++进阶系列:拷贝构造函数与NRV优化
<深度探索C++对象模型>第二章67页有: 这个程序的第一个版本不能实施NRV优化,因为test class 缺少一个copy constructor. 也就是缺少拷贝构造函数所以不能NR ...
- 解释:《深度探索C++对象模型》对NRV优化的讨论
原文地址:http://blog.csdn.net/zha_1525515/article/details/7170059 感谢作者! 大纲: 函数返回局部对象的拷贝的一般实现方式. NRV(Name ...
- GCC编译器下NRV优化
阅读侯捷老师翻译的深度探索C++对象模型时所进行的相关测试以及自己的理解 文章目录 一.浅讲NRV优化 二.测试代码 三.运行结果 四.结果分析以及解释 五.相关思考 六.没有NRV优化时的情况 总结 ...
- 《函数调用时参数、返回值所做的优化处理+编译器NRV优化》
摘要: c++中创建对象以及销毁对象时,会自动调用对象的构造.析构函数(默认的或自定义的),因此,当我们在c++中调用函数时应该特别注意传参以及返回值时的优化处理,以减少构造.析构函数调用时的开销.同 ...
- 关于NRV优化详细分析
在C++中,函数返回整数或指针是通过eax寄存器进行传递的,理解起来比较简单. 但是返回对象或结构体一直是令人感到困惑的问题.今天我整理了一下,将整个返回过程写下来,以作备用. 还是先通过一个例子来理 ...
- 自己动手理解NRV优化
一.NRV的简单理解 NRV是Named Return Value的简称.NRV优化简单的说:有一条语句,A a = f():其中f()是一个函数,函数里边申请了一个A的对象b,然后把对象b返回.在对 ...
- C++对象模型的那些事儿之五:NRV优化和初始化列表
前言 在C++对象模型的那些事儿之四:拷贝构造函数中提到如果将一个对象作为函数参数或者返回值的时候,会调用拷贝构造函数,编译器是如何处理这些步骤,又会对其做哪些优化呢?本篇博客就为他家介绍一个编译器的 ...
- 参数返回值及NRV优化(named return value optimization)
C++11中的移动构造函数又把NRV优化翻出来了,都是采用临时中间值优化,两者不能共存. 参数传递如何实现? [实现模型1]引入临时对象,使用拷贝构造函数初始化.然后利用bitwise copy将其拷 ...
最新文章
- mysql generator 命令_MyBatis Generator速查手册
- nginx子请求并发处理
- PHP变参函数的实现
- python 正则search 所有_python之路----正则re(search,match,findall……)
- Elasticsearch query和filter过滤有什么不同
- 前端 html border-right: 1px solid red;
- mysql 3_mysql3
- 织梦使用if判断某个字段是否为空
- Qfarm /load命令
- 在回调中获取Url参数
- load data file使用详解
- AndroidStudio遇到的问题
- 一般人想象不到的创业者付出的5种努力 创业者的背后
- Multisim彻底卸载干净方法
- Cohen's d 效应量计算
- 11 款可替代 top 命令的工具
- iOS 开发者都该认真思考的问题 (精华)
- Delphi皮肤控件分析与QQ的皮肤变色功能
- IDEA项目包的导入以及压缩包的快速导出
- GOOGLE 手机定位厘米挑战赛选手提到的技巧、方法总结