临时变量的内存分配
这里考虑对象做为函数参数与返回值时,使用无名临时变量的情况。
临时变量内存分配
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
}