C++愤恨者札记5——临时变量的内存分配

临时变量的内存分配

这里考虑对象做为函数参数与返回值时,使用无名临时变量的情况。

临时变量内存分配

class Node
{
		public:
			int data1;
			int data2;
			int data3;
			Node()
			{__asm nop}
};

void Fn1( Node n )
{
		n.data1++;
}

Node Fn2()
{
		return Node();
}

void main()
{
		__asm int 3
		Fn1( Node() );
		__asm int 3
		Fn2();
		__asm int 3
}


调用Fn1时的反汇编结果:


Fn2相关反汇编结果:


结论是临时变量的内存来自于函数的调用者

修改临时变量的值

Fn1的参数并不是临时变量本身,而是由临时变量填充,在Fn1内部无法对其变量。而Fn2传入的是临时变量指针,可以在Fn2内外对其进行修改,下面是实验代码:

static int gTemp = 0;
class Node
{
		public:
			int data;
			Node()
			{
					if ( 0 == gTemp )
					{
							this->data = 0;
							gTemp++;
					}
					else
							this->data++;
			}
};

Node Fn2()
{
		return Node();
}

void main()
{
		Node* p = 0;
		__asm int 3
		while ( true )
		{
				p = &Fn2();
				p->data++;
		}
		__asm int 3
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值