编译器构造函数优化(NRV 优化)

NRV优化,即Name Return Value优化,是编译器在函数返回值优化中的一种技术。主要针对函数以值返回的情况,避免不必要的拷贝构造,提高程序效率。本文详细介绍了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类型的默认构造函数
    //处理ret
    return 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优化时,我们显示指定),得看实际情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值