Forlan

如果可以一直活在C++的世界里,我是很愿意的。
posts - 1, comments - 0, trackbacks - 0, articles - 3
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

NRV的问题

Posted on 2009-06-18 23:26 forlan 阅读(175) 评论(0)  编辑 收藏 引用

// test1.cpp: 主项目文件。

#include "stdafx.h"

using namespace System;

#include <iostream>
using namespace std;

int iNum = 0;
class CTest
{
public:
    CTest()
    {
        iNum++;
        cout << "constructor" << endl;
    }
    CTest(const CTest& rhs)
    {
        iNum++;
        cout << "copy constructor" << endl;
    }
};

CTest func1()
{
    CTest t2;
    return t2;
}

int main(array<System::String ^> ^args)
{
    CTest t1 = func1();
    cout << iNum << endl;
    return 0;
}


大家猜猜上面iNum输出的结果是:
A 0   B 1   C 2   D  3

可能绝大部分人都选C的,少数可能会选D。

VC8 Debug模式下的结果:
constructor
copy constructor
2
请按任意键继续. . .

VC8 Release模式下的结果(带优化选项):
constructor
1
请按任意键继续. . .


结果居然不一样??
如果我们把Release的优化关闭,那输出结果和Debug下是一样的,证明是优化的问题!
VC8都帮我们干了些什么啦?
没错,就是NRV(named return value)。
《Inside The C++ Object Model》里面关于返回值的优化一节,就有很详细的说明。
我猜,VC8就是这样优化代码的:

void func1(CTest& rhs)
{
    return rhs;
}

int main(array<System::String ^> ^args)
{
    CTest t1;
    func1(t1);
    cout << iNum << endl;
    return 0;
}

优化后,没有了copy constructor,只有一次constructor,所以Release优化模式下的打印结果,就很正常了。


只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理