关于复制构造函数和局部变量的一个奇怪问题

selooloo 2010-06-12 11:11:06
代码如下:

#include <iostream>
using namespace std;

struct A
{
int i;
A(int n=0):i(n) {cout<<"A construct"<<endl;}
A(const A& a):i(a.i) {cout<<"A copy construct"<<endl;}
A operator =(const A& a){ i=a.i;cout<<"A operator ="<<endl; return *this;}
A fcn() {A la(1);return la;}
~A() {cout<<"A destruct"<<endl;}
};
int main(void)
{
{
A a(3),a1(a);
cout<<a1.i<<endl;
a1=a.fcn();
cout<<a1.i<<endl;
}
getchar();
return 0;
}



A fcn() {A la(1);return la;} 这个应该调用复制构造函数不是么,但运行情况是没有调用复制构造函数,而结果是正确的
A fcn() {staitc A la(1);return la;} 将a改成静态的才会调用复制构造函数,
A operator =(const A& a){ i=a.i;cout<<"A operator ="<<endl; return *this;} 这个按预想的调用了复制构造函数

为什么将la改为静态变量才会调用复制构造函数?
A fcn() {A la(1);return la;}对这句编译器是不是进行了优化?
a1=a.fcn();la作为局部变量应该是在return la后被析构的吧,但显示的怎么是调用operator =后才调用析构?

上面只是测试代码,有很多不好 的写法,只想求个解释
...全文
148 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
selooloo 2010-06-13
  • 打赏
  • 举报
回复
郁闷下,结贴了
ming0753 2010-06-12
  • 打赏
  • 举报
回复
A construct
A copy construct
3
A construct
A copy construct
A destruct
A operator =
A copy construct
A destruct
A destruct
1
9//从键盘输入一个字符
A destruct
A destruct
Press any key to continue
我调试的就是这样,正确呀!!!
we_sky2008 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 we_sky2008 的回复:]
C/C++ code

//具名返回值优化:

A fcn()
{
A la(1);
return la;
}

//会被编译器修改为:
void fcn(A &ret)
{
A ret(1);
return;
}
[/Quote]
说错了,应该是:

具名返回值优化:

A fcn()
{
A la(1);
return la;
}

会被编译器修改为:
void fcn(A &ret)
{
ret.A::A(1);
return;
}
liutengfeigo 2010-06-12
  • 打赏
  • 举报
回复

//lthyxy: 严禁灌水~
hfCoder 2010-06-12
  • 打赏
  • 举报
回复
mark
we_sky2008 2010-06-12
  • 打赏
  • 举报
回复

//具名返回值优化:

A fcn()
{
A la(1);
return la;
}

//会被编译器修改为:
void fcn(A &ret)
{
A ret(1);
return;
}
yunyun1886358 2010-06-12
  • 打赏
  • 举报
回复
搂主用的什么编译器,我这里是调到了:
A construct
A copy construct
3
A construct
A copy construct
A destruct
A operator =
A copy construct
A destruct
A destruct
1
A destruct
A destruct
pengzhixi 2010-06-12
  • 打赏
  • 举报
回复
如果做了优化,那么很可能将a1作为fcn的一个引用参数,然后直接在fcn内部对a1的成员进行赋值。
可以我这看不到汇编代码,不然应该还是能看出点猫腻
pengzhixi 2010-06-12
  • 打赏
  • 举报
回复
你先看看调用了多少次析构函数然后再决定是否做了优化吧
taodm 2010-06-12
  • 打赏
  • 举报
回复
优化
呃,没法更简单了,回复内容太短了!
selooloo 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
楼主去看《深度探索C++对象模型》和《(more) exceptional C++》
关于返回值方面的优化话题。
[/Quote]
能不能简单解释下先,远水解不了近渴啊
taodm 2010-06-12
  • 打赏
  • 举报
回复
楼主去看《深度探索C++对象模型》和《(more) exceptional C++》
关于返回值方面的优化话题。
lvshaoqing 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
楼主去看《深度探索C++对象模型》和《(more) exceptional C++》
关于返回值方面的优化话题。
[/Quote]

你别老叫人去看这边书。 这本书早就过时了。 现在主流的编译器根本是不这么干的。 诶,真不会与时俱进。 过时的东西还到处叫人去看。
cattycat 2010-06-12
  • 打赏
  • 举报
回复
我的gcc执行结果


A construct
A copy construct
3
A construct
A operator =
A copy construct
A destruct
A destruct
1
A destruct
A destruct
vs08的结果
A construct
A copy construct
3
A construct
A copy construct
A destruct
A operator =
A copy construct
A destruct
A destruct
1
A destruct
A destruct

可以看到还是不一样的,gcc少拷贝了一次。这个返回值优化是编译器做的事情。
pengzhixi 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 selooloo 的回复:]
我用的是DEV,看来是编译器的优化问题
有没有禁用优化的方法,volatile 可以吗
[/Quote]
知道有这么一回事就OK了。
taodm 2010-06-12
  • 打赏
  • 举报
回复
这个优化基本不受控制的,不要折腾了。
selooloo 2010-06-12
  • 打赏
  • 举报
回复
我用的是DEV,看来是编译器的优化问题
有没有禁用优化的方法,volatile 可以吗

64,650

社区成员

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

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