首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

暂时对象在哪个函数帧

2013-04-02 
临时对象在哪个函数帧?临时对象在哪个函数帧?class Test{int datachar datac}Test fun(){return Test()

临时对象在哪个函数帧?
临时对象在哪个函数帧?


class Test
{

int data;
char datac;
};

Test fun()
{

return Test();
};


//test

int main()
{
Test obj;
obj=fun();//这里会有2个对象,一个是Test(),一个是临时的看不见的
}

请问 这个临时的对象在哪一个栈里?

在main函数帧里,还是fun函数帧里?


[解决办法]
一般来说临时对象地址在调用函数,而不是被调函数。临时对象不一定存在,取决于编译器。


 Test obj;
011515A1  lea         ecx,[obj]  
011515A4  call        Test::Test (11511F4h)  
011515A9  mov         dword ptr [ebp-4],0  
  obj=fun(); //这里会有2个对象,一个是Test(),一个是临时的看不见的
011515B0  lea         eax,[ebp-0C8h]  // ebp-0c8就是临时对象的地址
011515B6  push        eax  
011515B7  call        fun (11510A5h)  
011515BC  add         esp,4  
011515BF  mov         dword ptr [ebp-0CCh],eax  //以下代码把临时对象赋值拷贝到obj
011515C5  mov         ecx,dword ptr [ebp-0CCh]  
011515CB  mov         dword ptr [ebp-0D0h],ecx  
011515D1  mov         byte ptr [ebp-4],1  
011515D5  mov         edx,dword ptr [ebp-0D0h]  
011515DB  push        edx  
011515DC  lea         ecx,[obj]  
011515DF  call        Test::operator= (115122Bh)  
011515E4  mov         byte ptr [ebp-4],0  
011515E8  lea         ecx,[ebp-0C8h] //析构临时对象ebp-0c8h  
011515EE  call        Test::~Test (1151073h)  
  fun();
011515F3  lea         eax,[ebp-0A0h]  //另一个临时对象epb-0a0h
011515F9  push        eax  
011515FA  call        fun (11510A5h)  
011515FF  add         esp,4  
01151602  lea         ecx,[ebp-0A0h]  临时对象epb-0a0h被析构
01151608  call        Test::~Test (1151073h)  
  return 0;
0115160D  mov         dword ptr [ebp-78h],0  
01151614  mov         dword ptr [ebp-4],0FFFFFFFFh  
0115161B  lea         ecx,[obj]  
0115161E  call        Test::~Test (1151073h)  


01151623  mov         eax,dword ptr [ebp-78h]  

热点排行