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:22:53
小明
This compiler optimization, sometimes referred to as the Named Return Value (NRV) optimization, is described in Section 12.1.1c of the ARM (pages 300?03). The NRV optimization is now considered an obligatory Standard C++ compiler optimization, although that requirement, of course, falls outside the formal Standard.
以上引用于Inside C++ Object Model 2.3节
结果是:
NRV falls outside the formal Standard
网友评论2012-11-20 10:22:44
周星星
如果我们的程序运行的结果依赖编译器的优化或者不优化,那么我们程序本身就有问题。
--- 未必,现在的绝大部分C++代码都无法在TC中编译通过,难道说现在的C++代码都有问题?
正确的说,应该是:对于C++标准没有规定的情况,如果我们的程序运行的结果依赖某个编译器的做或不做,那么我们程序本身就有问题。
如果C++标准明确规定了,但这个编译器却没有依照标准执行的话,不能说明我们程序本身有问题,要么换一个更好的编译器,要么重新设计以避开这个不符合标准的特性。
我现在的问题是不能确定C++标准中有没有规定 有side-effects用途的具名对象返回时应不应该优化 ?
如果标准没有规定,那么就是gcc3.42和vc2005 release自行扩展了优化条件;
如果标准规定了,那么就是vc2005 debug 有 bug 了。