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

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

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

网友评论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:17

非典型秃子
这个优化问题是可选的。不过,Debug和Release版本的不一致,也确实是个问题。
不过话说回来,这种依赖拷贝次数的代码,本身就是一种hack行为。换句话说,用任何编译器,我们的代码总有办法判断出当前是debug版本还是release版本(不必劳驾_DEBUG), 编译器最多能做到的就是在恰当的编码下,能产生恰当的结果而已。

网友评论2012-11-20 10:24:09

周星星
你说的CPP98标准我有,ISO/IEC 14882 Second edition 2003-10-15:
http://blog.vckbase.com/Files/bruceteen/cpp2003.zip

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

abcs
我的观点是,allow!=force,这不是“应该”的问题,是“可以”的问题,优化与否编译器决定。至于是否debug和release一定要输出一致,我潜意识认为“否”,至少我不认同把排中律简单地应用在不同的输出上。网上找不到iso/iec 14882:2003,没有原文来咬文嚼字研究,都是猜测。