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