Chinaunix首页 | 论坛 | 博客
  • 博客访问: 988615
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-20 10:21:18

先看一段代码:
#include
using namespace std;

class foo{
public:
    foo() { cout<<"default constructor calling."<    foo( const foo& p ) { cout<<"copy constructor calling."<    foo& operator=( const foo& p ) { cout<<"assigned operator calling."<    ~foo() { cout<<"destructor 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用途时)返回时应不应该优化?

争论太多了,留在这里“秋后问斩”^_^

阅读(3345) | 评论(19) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-20 10:23:52

周星星
按照你贴出来的这段话,对于我文中给出的代码,是不是应该将拷贝构造优化掉?
如果你回答否,那么你贴出来的这段话能解答我什么问题呢?
如果你回答是,那么VC++8.0也就是没有按照标准来优化,既然如此,在你给的文章《Named Return Value Optimization in Visual C++ 2005》中它是在吹嘘自己的什么特性呢?

网友评论2012-11-20 10:23:42

abcs
我问的正是"C++ standard"。MS的文章里面有一句:
The C++ standard allows the elision of the copy constructor (even if this results in different program behavior), which has a side effect of enabling the compiler to treat both objects as one (see section 12.8. Copying class objects, paragraph 15; see Reference).
Reference
The C++ Standard Incorporating Technical Corrigendum 1 BS ISO/IEC 14882:2003 (Second Edition)
说的就是这个事情么?

网友评论2012-11-20 10:23:35

周星星
谢谢,我这里说的“标准”是指“C++标准”,VC++的标准与我无关,我并不关心。

另外,我英文不好,如《Named Return Value Optimization in Visual C++ 2005》所说,是不是我本文中的代码应该优化掉拷贝构造?但VC2005的实际表现却不是这样。

网友评论2012-11-20 10:23:18

suomynona
ARM(Annotated Reference Manual[1990年])并不能说是很标准,  
现在来说它已经足够的OLD了. 要找证据应在ISO/IEC 14882:1998 document是找.