2012年(158)
分类: C/C++
2012-11-20 10:21:18
先看一段代码:
#include
using namespace std;
class foo{
public:
foo() { cout<<"default constructor
calling."<
foo bar()
{
foo t;
return t;
}
int main(void)
{
{
foo a = bar();
// gcc3.4.2中
// default
constructor calling.
// destructor calling.
//
VC2005(77626-009-0000007-41837)中
// default constructor
calling.
// copy constructor calling.
// destructor
calling.
// destructor calling.
}
cout <<
"--------" << endl;
{
foo b;
b =
bar();
// gcc3.4.2中
// default constructor
calling.
// default constructor calling.
// assigned
operator calling.
// destructor calling.
// destructor
calling.
// VC2005(77626-009-0000007-41837)中
// default
constructor calling.
// default constructor calling.
// copy constructor calling.
// destructor calling.
// assigned operator calling.
// destructor calling.
// destructor calling.
}
return 0;
}
问题就在
foo bar()
{
foo t;
return
t;
}
中,return t 时调不调用拷贝构造函数? 更一般的说,在最近的C++标准中,具名对象(且这个对象有side
effects用途时)返回时应不应该优化?
争论太多了,留在这里“秋后问斩”^_^
网友评论2012-11-20 10:24:45
C++ 中函数值返回的过程中的问题,是否创建临时变量 – 英特尔® 软件网络博客 - 中文
引用了该文章,地址:http://software.intel.com/zh-cn/blogs/2011/03/24/c-8/
网友评论2012-11-20 10:24:27
veiz
"debug和release一定要输出一致".
在这个例子中,大家要想让VC8的debug和release输出一致其实也简单,就在debug属性里钩选“代码优化”,再把“基本运行时检查”的参数改为“默认值”即可。这样VC2005的实际表现就是,在debug下把本文中的代码优化掉拷贝构造!
VC8的debug默认是完全无优化的,这算是尽职尽责,让人放心。而g++的debug喜欢慷慨地为我们优化代码。
“--- 哇,输出差异成这样,那…… ”
星星当时一定对VC8的操作和配置不太熟悉,不知道现在怎么样了,呵呵。而且我猜星星很少在命令行模式下编译。搞Windows开发的一般来说都不善于写配置。我如果写不是很复杂的程序,那就在UtralEdit下编辑程序,然后用命令行下cl.exe编译运行
网友评论2012-11-20 10:24:09
周星星
你说的CPP98标准我有,ISO/IEC 14882 Second edition 2003-10-15:
http://blog.vckbase.com/Files/bruceteen/cpp2003.zip