e股脑电脑教程网
  • 首 页
  • 操作系统
  • 应用软件
  • 下载工具
  • 影音视频
  • 办公软件
  • 媒体制作
  • 网站建设
  • 平面设计
  • 数据库
  • 程序开发
  • 视频教程
编辑推荐: | 文章搜索:
您现在的位置: e股脑 >> 程序开发 >> ASP.net教程 >> Visual C++ 2005中的命名返回值优化 >> 教程正文
 
教程搜索
 
 
相关教程
  • C++/CLI实战——HELLO
  • VC编写简单的序列号(SN)填写器
  • Visual Studio 2005体验泛型编程
  • C++/CLI基本数据类型探索
  • 用托管C++编写Windows服务
  • Visual C++ 2005图像编程之属性设置栏
  • Visual C++ 2005图像编程之工具栏
  • Visual C++ 2005图像编程之预备知识
  • 把其他C/C++编译器集成到VC2005中
  • VC.NET实现清爽便利的Windows游戏窗口
  • C++:最强大的.NET语言之可访问性
  • C++:最强大的.NET语言之装箱
  • C++:最强大的.NET语言之内存与资源
  • C++:最强大的.NET语言之对象构造
  • Visual C++2005中开发自定义绘图控件
  • C++/CLI程序进程之间的通讯
 
 

图文教程


  • Windows抢了谁的饭碗 非主流操作系统To

  • 地球还是火星 平常心看“非主流”

  • 综合运用Office 2007批量制作奖状

  • 没有系统盘如何才能修复受损系统?

  • 巧妙运用Excel中边界的附加功能!
 
 
赞 助 商
 
 
Visual C++ 2005中的命名返回值优化
  • 来源:e股脑
  • 点击次数:
  • 更新时间:2007-8-9

多年来,Microsoft Visual C++编译器一直在努力寻求更新的技术与优化方式,以求最大可能地提高程序的性能。此文描述了Visual C++编译器在不同情况下,是怎样消除多余的复制构造函数和析构函数的。

通常来说,当方法返回对象的一个实例时,会创建一个临时对象,并通过复制构造函数复制到目标对象中。在C++标准中,允许省略复制构造函数(哪怕会导致不同的程序行为),但这有一个副作用,就是编译器可能会把两个对象当成一个。Visual C++ 8.0(Visual C++ 2005)充分利用了C++标准的可伸缩性,加入了一些新的特性——命名返回值优化(NRVO)。NRVO消除了基于堆栈返回值的复制构造函数和析构函数,并去除了对多余复制构造函数和析构函数的调用,从而全面地提高了程序的性能。但要注意到,优化和未优化的代码,可能会有不同的程序行为表现。

而在某些情况下,NRVO不会进行优化(参见优化的局限性一节),以下是一些常见的情况:

·不同的路径返回不同的命名对象

·引入EH状态的多重返回路径(甚至所有的路径中返回相同的命名对象)

·由内联汇编语句引用的命名返回对象

NRVO优化概述

以下是一个简单的示例,演示了优化是怎样被实现的:

A MyMethod (B &var)

{

A retVal;

retVal.member = var.value + bar(var);

return retVal;

}

使用上述函数的程序可能会有一个像如下所示的构造函数:

valA = MyMethod(valB);

由MyMethod返回的值会创建在内存空间中,并通过隐藏的参数指向ValA。以下是函数中带有隐藏参数,并清晰地写明构造和析构函数时样子:

A MyMethod (A &_hiddenArg, B &var)

{

A retVal;

retVal.A::A(); // retVal的构造函数

retVal.member = var.value + bar(var);

_hiddenArg.A::A(retVal); // A的复制构造函数

return;

retVal.A::~A(); // retVal的析构函数

}

从以上代码中,很明显可看出有一些可以优化的地方。最基本的想法是消除基于堆栈的临时值(retVal),并使用隐藏参数,从而消除那些基于堆栈值的复制构造函数和析构函数。以下是NRVO优化过的代码:

A MyMethod(A &_hiddenArg, B &var)

{

_hiddenArg.A::A();

_hiddenArg.member = var.value + bar(var);

Return

}

示例代码

Sample1.cpp:比较简单的示例代码


#include <stdio.h>

class RVO

{

public:

RVO(){printf("I am in constructor\n");}

RVO (const RVO& c_RVO) {printf ("I am in copy constructor\n");}

~RVO(){printf ("I am in destructor\n");}

int mem_var;

};

RVO MyMethod (int i)

{

RVO rvo;

rvo.mem_var = i;

return (rvo);

}

int main()

{

RVO rvo;

rvo=MyMethod(5);

}

打开或关闭NRVO编译sample1.cpp,将会产生不同的程序行为。

不带NRVO编译(cl /Od sample1.cpp),下面是输出内容:

I am in constructor

I am in constructor

I am in copy constructor

I am in destructor

I am in destructor

I am in destructor

用NRVO选项编译(cl /O2 sample1.cpp),以下是输出内容:

I am in constructor

I am in constructor

I am in destructor

I am in destructor

Sample2.cpp:较复杂一点的代码

#include <stdio.h>

class A {

public:

A() {printf ("A: I am in constructor\n");i = 1;}

~A() { printf ("A: I am in destructor\n"); i = 0;}

A(const A& a) {printf ("A: I am in copy constructor\n"); i = a.i;}

int i, x, w;

};

class B {

public:

A a;

B() { printf ("B: I am in constructor\n");}

~B() { printf ("B: I am in destructor\n");}

B(const B& b) { printf ("B: I am in copy constructor\n");}


};

A MyMethod()

{

B* b = new B();

A a = b->a;

delete b;

return (a);

}

int main()

{

A a;

a = MyMethod();

}

不带NRVO(cl /Od sample2.cpp)的输出如下:

A: I am in constructor

A: I am in constructor

B: I am in constructor

A: I am in copy constructor

B: I am in destructor

A: I am in destructor

A: I am in copy constructor

A: I am in destructor

A: I am in destructor

A: I am in destructor

当打开NRVO优化时,输出如下:

A: I am in constructor

A: I am in constructor

B: I am in constructor

A: I am in copy constructor

B: I am in destructor

A: I am in destructor

A: I am in destructor

A: I am in destructor 优化的局限性

在某些情况下,NRVO优化不会起作用,以下是存在优化局限性的一些示例程序。

Sample3.cpp:含有例外的代码

在例外(Exception)情况中,隐藏参数必须在它被替换的临时范围内析构。

//RVO类定义在sample1.cpp中

#include <stdio.h>

RVO MyMethod (int i)

{

RVO rvo;

rvo.mem_var = i;

throw "I am throwing an exception!";

retu

1 2 3 下一页
  • 上一篇教程: Visual C++ 2005 中的XML注释
  • 下一篇教程: VC2005下利用OpenGL实现三维绘图
  •  

    关于本站 | 广告联系 | 版权声明 | 使用帮助

    Copyright © 2004-2008 www.egunao.com All rights reserved.