首页
社区
课程
招聘
c++中临时对象的产生?编译器优化了?
发表于: 2011-10-25 11:16 5887

c++中临时对象的产生?编译器优化了?

2011-10-25 11:16
5887
class A
{
	friend ostream& operator<<(ostream& os,const A&);
	friend A operator+(const A&,const A&);
public:
	A(int i=0):m_i(i){cout<<"A(int i=0)"<<endl;}
	A(const A& a)
	{
		m_i=a.m_i;
		cout<<"A(const A&)"<<endl;}
	const A& operator=(const A& a)
	{
		cout<<"const A& operator=(const A& a)"<<endl;
		m_i=a.m_i;
		return *this;
	}
	~A()
	{cout<<"~A()"<<endl;}
private:
	int m_i;
};
A operator+(const A& a,const A& b)
{
	A c=a.m_i+b.m_i;
	return c;
}
ostream& operator<<(ostream& os,const A& a)
{
	os<<"ostream& operator<<(operator& os,const A&)"<<endl;
	cout<<a.m_i<<endl;
	return os;
}
const A& f(const A& a)
{
	return a;
}
const A func(const A a)
{
	return a;
}
int main(int argc,char**argv)
{
	/*const A& a=A();
	cout<<"_______________________"<<endl;
	cout<<f(A())<<endl;
	cout<<"-----------------------"<<endl;
	const A b=func(A());
	cout<<"as"<<endl;*/
	A a1(3),a2(4);
	a1+a2;
	cout<<"仅仅是区分一下是否产生临时对象:"<<endl;
	A c=a1+a2;
	cout<<c<<endl;
	return 0;
}

上述代码运行结果上半部分在意料之中:a1+a2首先会调用operator+,他的返回方式是按值返回,因此会触发复制构造函数创建函数中c的副本,函数执行完毕c———局部对象被析构掉,a1+a2产生了临时对象,这是表达式,因此临时对象生命周期瞬间到期,马上死掉了,因此再次析构掉此临时对象。2次析构。
后半部分A c=a1+a2;一直到执行完毕总共析构了4次,应该是c(operator中),a1,a2,c(main中)分别析构,那这里a1+a2没产生临时对象吗?如果产生了,那这个临时对象也该被析构的,就应该是析构5次啊,是编译器优化了?那前半部分怎么没优化?另外,如果没优化,那这个临时对象的生命周期是多少?跟c一样长?还是跟前半部分一样,表达式结束到期?

ps:在网上有这样的说法:临时对象的生存时限在这本书中只花了不长的篇章,但说的很清楚,临时对象的生存时限 限制在其出现的“完整”的表达式
中,“完整”的表达式结束了,临时对象也就销毁了。例外是把临时对象被引用或者初始化给具名对象,临时对象的生存周期
会加长到引用或者具名对象的生存周期。

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
你把自己绕进去了,A c=a1+a2;这句中,c是在operator +中完成拷贝构造的,而不是operator +返回一个对象,然后再调拷贝构造完成c的构造;从另一个角度说,一次析构要对应一次构造,如果有你想象中的临时对象,它是什么时候被构造的?
2011-10-25 15:12
0
雪    币: 297
活跃值: (483)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
LEA EAX,DWORD PTR SS:[EBP-14] -- a2
PUSH EAX
LEA ECX,DWORD PTR SS:[EBP-10] -- a1
PUSH ECX
LEA EDX,DWORD PTR SS:[EBP-18] -- c
PUSH EDX
CALL Test.0040101E -- operator+
ADD ESP,0C

EDX在operator+完成了拷贝构造

A operator+(const A& a,const A& b)
{
        A c=a.m_i+b.m_i; 构造
        return c; edx拷贝构造 c析构
}
2011-10-25 19:18
0
雪    币: 2676
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
对于函数返回对象的情况,C++标准是允许编译器进行优化的。
http://en.wikipedia.org/wiki/Return_value_optimization
现代编译器,如果定义了copy constructor,一般都会触发NRVO的。
2011-10-25 23:37
0
雪    币: 132
活跃值: (214)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5
嗯,应该就是你说的这种情况了。
2011-10-26 09:43
0
雪    币: 90
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
支持楼主,大家都来支持啊,字数补丁,颜色补丁,插图补丁...
2011-10-26 09:53
0
游客
登录 | 注册 方可回帖
返回
//