关于g++中拷贝构造函数被优化的情况
2014-06-05 16:59
120 查看
参阅如下代码:
编译运行后发现如下问题:
1,f()函数返回时的拷贝构造函数没有调用,导致main()函数中的b对象没有得到预期值;
2,打印f()函数中的对象i和main()函数中的对象b,发现地址一致;说明整个程序中只产生了一个对象。
经过查阅网络资料,发现 http://bbs.csdn.net/topics/390542033 帖子也遇到了同样的问题,并给出了答案,由于优化的原因,导致了函数f()的返回值被放到了调用方main中。
看看多个变量从f()中生成的情况,事实上变量都是在main()中:
cat t1.cpp #include <iostream> #include <cstdio> using namespace std; class A{ public: A(int _i,int _j){ cout<<"con 2"<<endl; i = _i; j = _j; a = 999; }; A(const A& a){ cout<<"copy"<<endl; this->i = a.i; this->a = a.j; this->j = 888; }; ~A(){ cout<<"d"<<endl; }; A& operator=(const A& other){ cout<<"in operator"<<endl; this->i = other.i; this->a = other.j; this->j = 777; return *this; } int i; int a; int j; }; A f() { A i(1,2); printf("in f():i addr is =%x\n",&i); return i; } int main() { A b = f(); printf("in main():b addr is =%x====i=%d====j=%d=====a=%d\n",&b,b.i,b.j,b.a); }
编译运行后发现如下问题:
1,f()函数返回时的拷贝构造函数没有调用,导致main()函数中的b对象没有得到预期值;
2,打印f()函数中的对象i和main()函数中的对象b,发现地址一致;说明整个程序中只产生了一个对象。
con 2 in f():i addr is =796bb0 in main():b addr is =796bb0====i=1====j=2=====a=999 d
经过查阅网络资料,发现 http://bbs.csdn.net/topics/390542033 帖子也遇到了同样的问题,并给出了答案,由于优化的原因,导致了函数f()的返回值被放到了调用方main中。
看看多个变量从f()中生成的情况,事实上变量都是在main()中:
#include <iostream> #include <cstdio> using namespace std; class A{ public: A(int _i,int _j){ cout<<"con 2"<<endl; i = _i; j = _j; a = 999; }; A(const A& a){ cout<<"copy"<<endl; this->i = a.i; this->a = a.j; this->j = 888; }; ~A(){ cout<<"d"<<endl; }; A& operator=(const A& other){ cout<<"in operator"<<endl; this->i = other.i; this->a = other.j; this->j = 777; return *this; } int i; int a; int j; }; A f() { A i(1,2); printf("in f():i addr is =%x\n",&i); return i; } A call_f() { A c = f(); printf("in caller ():c addr is =%x\n",&c); return c; } int main() { int i; A a = call_f(); A b = f(); A c = f(); printf("in main() i addr is %x\n",&i); printf("in main():a addr is =%x====i=%d====j=%d=====a=%d\n",&a,a.i,a.j,a.a); printf("in main():b addr is =%x====i=%d====j=%d=====a=%d\n",&b,b.i,b.j,b.a); printf("in main():c addr is =%x====i=%d====j=%d=====a=%d\n",&c,c.i,c.j,c.a); } ./a.out con 2 in f():i addr is =d774aae0 in caller ():c addr is =d774aae0 con 2 in f():i addr is =d774aad0 con 2 in f():i addr is =d774aac0 in main() i addr is d774aaec in main():a addr is =d774aae0====i=1====j=2=====a=999 in main():b addr is =d774aad0====i=1====j=2=====a=999 in main():c addr is =d774aac0====i=1====j=2=====a=999 d d d
相关文章推荐
- MySQL关于分页较多的情况的优化limit xxxx,xx
- 论构造函数和拷贝构造函数的调用情况(优化)
- 关于需要优化的大表在不影响 业务的情况下实现数据转移到新分区表
- 关于jdbc连接出现conn关闭情况以及部分优化
- 【二十】关于利用squidclient分析日志未命中情况寻求优化
- 关于何种情况下使用DataGrid、DataList或Repeater的一些讨论
- 关于JDBC的优化之一
- 关于何种情况下使用DataGrid、DataList或Repeater的一些讨论
- 关于何种情况下使用DataGrid、DataList或Repeater的一些讨论
- 关于何种情况下使用DataGrid、DataList或Repeater的一些讨论
- 关于何种情况下使用DataGrid、DataList或Repeater的一些讨论
- 关于何种情况下使用DataGrid、DataList或Repeater的一些讨论
- 关于FreeBSD 5优化的补充(原创)
- 关于gcc和g++编译的问题
- 关于j2me程序的优化!
- 关于Linux常见紧急情况的处理方法
- 关于何种情况下使用DataGrid、DataList或Repeater的一些讨论
- 不更改代码的情况下如何优化数据库系统
- 关于何种情况下使用DataGrid、DataList或Repeater的一些讨论
- 关于何种情况下使用DataGrid、DataList或Repeater的一些讨论(3) ambushaa [翻译] [转]