Named Return Value Optimization(具名返回值优化) 在 visual c++中
来源:互联网 发布:手机淘宝开通支付宝 编辑:程序博客网 时间:2024/05/09 00:44
在visual c++ 2005和较前版本中,似乎都不支持《深入探索c++对象模型》中所说的:“用户是否定义copy structor(复制构建)决定是否打开NRV优化”,在vc++中,无论是否自定义copy structor,都会产生NRV优化。
话说要产生NRV优化,要满足“函数中所有的路径都返回相同的具名数值 (Named Value)”,这里所说的所有的路径都返回相同的具名数值,我不知该理解为所有的路径都返回同一对象,还是理解为函数中只出现一个return语句。我在vc++的测试中,当函数中只出现一个return语句时才会产生NRV优化,即使连续两个一模一样的return语句,也会让NRV优化躲起来。在我转载的文章"Named Return Value Optimization 具名返回值优化"中,对于前一个问题已经进行了讨论,我在这也就不说多嘴了。这里只是说说两个return语句就能在vc++中消灭NVR优化的问题。
例:
定义如下类
class Test
{
public:
Test()
: m_x(0), m_y(0) { std::cout << "Test structor" << std::endl; }
Test(const Test &tst)
: m_x(tst.m_x), m_y(tst.m_y) { std::cout << "Test copy structor" << std::endl; }
~Test()
{ std::cout << "Test destructor" << std::endl; }
void setX(int x) { m_x = x; }
void setY(int y) { m_y = y; }
private:
int m_x;
int m_y;
};
写个如下函数
Test func(int x, int y)
{
Test xx;
xx.setX(x);
xx.setY(y);
return xx;
}
然后在main函数中如此
int main()
{
int x = 10;
int y = 20;
Test tt = func(x, y);
return 0;
}
够简单吧,按照NRV的说法,func会被转换成如下形式:
viod func(Test & __result, int x, int y)
{
//c++伪代码
__result.Test::Test();
__result.Test::setX(x);
__result.Test::setY(y);
return;
}
这样就节省了叫一个临时工xx对象的开资(在原始func代码中有这么一句 Test xx; )。别小看这么点开资,使用数目大了节约效果还是很显著的。
执行结果如下:
Test structor
Test destructor
注意:要把程序编译成Release版本,才会生成NRV优化后的代码。
如果在func函数后面加一个return语句,如下:
Test func(int x, int y)
{
Test xx;
xx.setX(x);
xx.setY(y);
return xx;
return xx;
}
则输出结果如下:
Test structor
Test copy structor
Test destructor
Test destructor
怎么样,是不是干掉了?
- Named Return Value Optimization(具名返回值优化) 在 visual c++中
- Named Return Value Optimization (具名返回值优化)
- Named Return Value Optimization 具名返回值优化
- Named Return Value Optimization (具名返回值优化)
- 关于Named Return Value(NRV)optimization-返回值优化
- 参数返回值及NRV优化(named return value optimization)
- named return value optimization
- Named Return Value Optimization
- RVO(Return Value Optimization)和NRVO(Named Return Value Optimization)
- RVO:Return value optimization
- NRV (named return value)
- The Name Return Value Optimization
- (具名)返回值优化 和 复制省略
- c#中获取存储过程的返回值(return Value)
- C++编译优化之RVO(Return Value Optimization) &&C++直接初始化与赋值初始化的区别
- name return value优化测试
- C/C++ return返回值的问题
- C语言的返回值return总结
- 3D纹理的缘起(转)
- Windows 7与虚拟机VMware下运行的UBUNTU10.10共享文件夹
- Windows XP虚拟机vmware中安装Linux步骤
- Refactor反编译C#程序
- 事件对象
- Named Return Value Optimization(具名返回值优化) 在 visual c++中
- 在Oracle中连接远程数据库
- 我们到底需要多少旁路电容器?
- SSO
- Set IT Resource Instance parameters from Ant build script
- 函数调用方式
- 在Xcode以及Interface Builder下简单使用Cocoa (更新版)
- xv6中的pmap.c源代码
- 模板重复实例化错误