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优化模式下的打印结果,就很正常了。