奇怪! linux下函数返回对象不调用拷贝构造函数??

weichen2005 2010-07-26 04:54:35
如下程序:

#include <iostream>

using namespace std;

class test
{
public:
test()
{
m_i = 1;
cout << "test::ctor()" << endl;
}
test(const test& t)
{
cout << "test::cctor()" << endl;
//m_i = t.m_i;
m_i = 111;
}
~test()
{
//cout << "test::dtor()" << endl;
cout << "test::dtor(" << m_i << ")" << endl;
}
test& operator=(const test& t)
{
cout << "test::=()" << endl;
return *this;
}

public:
int m_i;
};

test myfunc()
{
test m;
m.m_i = 100;
return m;
}

int main()
{
//test t;
//test t2(t);
//t2.m_i = 2;

cout << "1" << endl;
test t = myfunc();
cout << "m_i is: " << t.m_i << endl;
t.m_i = 888;
//test t;
//test t2;
//t2 = t;
cout << "2" << endl;

return 0;
}


在vc2005下输出:
1
test::ctor()
test::cctor()
test::dtor(100)
m_i is: 111
2
test::dtor(888)
请按任意键继续. . .


在gcc3.4.6下输出:
1
test::ctor()
m_i is: 100
2
test::dtor(888)

奇怪的是,linux下没加任何优化选项,它为什么不调用拷贝构造函数呢???
...全文
142 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhixi 2010-07-26
  • 打赏
  • 举报
回复
好了,可以结贴了。这个优化是默认编译器就应该做的。
cattycat 2010-07-26
  • 打赏
  • 举报
回复
返回值优化,NRV的,编译器进行的优化,直接把t的地址传进去了,省略了中间对象的构造。
可以参考 深入探索c++对象模型 的2.3节返回值初始化那里介绍了这个优化。
太乙 2010-07-26
  • 打赏
  • 举报
回复
2.3.5 编译器优化
NRV(named return value)优化:
X bar(){X xx; return xx;}void bar(X& __result){__result.X::X();return __result;}
缺点:不知是否优化、编译器难以实施
一般而言,以一个obj作为另一个obj的初值,编译器视情况而定,程序员不能够安全地规划你的copy constructor的副作用
太乙 2010-07-26
  • 打赏
  • 举报
回复
X xx = bar();===》 X xx; bar(xx);//
太乙 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 taodm 的回复:]
去看《深度探索c++对象模型》
有些东西,其实就记个结论就行了。
[/Quote]

2.3.3 返回值的初始化
X bar(){X xx; return xx;}
1) 加上一个额外参数,类型为一个reference
2) 在return前安插一个copy constructor调用操作。
即:
X xx = bar();===》 X xx; bar(xx);//不会执行其默认构造函数
Bar().mmfunc();===》 X __tmp0; (bar(__tmp0),__tmp0).mmfunc();
liutengfeigo 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 taodm 的回复:]
去看《深度探索c++对象模型》
有些东西,其实就记个结论就行了。
[/Quote]
+1
taodm 2010-07-26
  • 打赏
  • 举报
回复
去看《深度探索c++对象模型》
有些东西,其实就记个结论就行了。
ayw215 2010-07-26
  • 打赏
  • 举报
回复
貌似是gcc直接给优化掉了
weichen2005 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
有一类名词叫返回值优化,是默认一定要开启的。
[/Quote]

我就是奇怪为什么默认情况下就是开启的呢???
ypb362148418 2010-07-26
  • 打赏
  • 举报
回复
编译器进行优化掉了
liutengfeigo 2010-07-26
  • 打赏
  • 举报
回复
优化掉了~
healer_kx 2010-07-26
  • 打赏
  • 举报
回复
RVO,google一下。
  • 打赏
  • 举报
回复
这个可能跟编译器有关,有些编译器会优化掉
taodm 2010-07-26
  • 打赏
  • 举报
回复
有一类名词叫返回值优化,是默认一定要开启的。

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧