Chinaunix首页 | 论坛 | 博客
  • 博客访问: 988101
  • 博文数量: 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用途时)返回时应不应该优化?

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

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

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

周星星
查到了,《Inside the C++ Object Model 》是96年5月3号发行的。

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

周星星
谢谢,但不知道那句话是在什么时候讲的,因为目前流行的C++书籍最新的也是在五六年前编写的。
据我所知,97年之前标准中就加入了 匿名对象的RVO,而97年秋又把 具名对象的RVO 加入了进去,使得C++中不存在没有RVO的情况。
当然就我听到的这个信息而言,我也不敢确信它一定是正确的。

网友评论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 了。

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

小明
其实我的意思是,如果我们的程序运行的结果依赖编译器的优化或者不优化,那么我们程序本身就有问题。