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优化时,我们显示指定),得看实际情况。
NRV优化,即Name Return Value优化,是编译器在函数返回值优化中的一种技术。主要针对函数以值返回的情况,避免不必要的拷贝构造,提高程序效率。本文详细介绍了NRV优化的原理、条件及应用实例。
&spm=1001.2101.3001.5002&articleId=86945624&d=1&t=3&u=695fa70e63b74f98a15a72c591c7d139)
2401

被折叠的 条评论
为什么被折叠?



