科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Visual C++ 2005中的命名返回值优化

Visual C++ 2005中的命名返回值优化

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

描述了Visual C++编译器在不同情况下,是怎样消除多余的复制构造函数和析构函数的。

作者:谢启东编译 来源:天极开发 2007年11月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
 优化的副作用

  程序员必须意识到,如此之类的优化将会影响到程序的流程,以下的示例代码演示了优化所带来的影响。

  Sample7.cpp
 
#include <stdio.h>

int NumConsCalls=0;

int NumCpyConsCalls=0;

class RVO

{

public:

RVO(){NumConsCalls++;}

RVO (const RVO& c_RVO) {NumCpyConsCalls++;}

};

RVO MyMethod ()

{

RVO rvo;

return (rvo);

}

void main()

{

RVO rvo;

rvo=MyMethod();

int Division = NumConsCalls / NumCpyConsCalls;

printf ("Constructor calls / Copy constructor calls = %d\n",Division);

}

  不带优化选项编译sample7.cpp(cl /Od sample7.cpp),程序的输出是在意料之中的,构造函数被调用了两次,而复制构造函数被调用了一次,因此,输出的结果为2。

Constructor calls / Copy constructor calls = 2

  另一方面,如果打开优化选项编译上述代码(cl /O2 sample7.cpp),NRVO将会起作用,并消除掉复制构造函数,因此NumCpyConsCalls结果为零,从而引发程序的除零错误。如果像sample7.cpp中那样没有很好地处理这种例外错误,将会导致程序崩溃。

  从以上可看出,命名返回值优化(NRVO)消除了多余的函数调用,从而在一定程度上提高了程序的速度,需记住的是,优化有时也会有副作用,请谨慎使用。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章