返回对象1(未调用拷贝构造函数)
對象作為返回值與對象作為參數處理方法非常類似,對象作為參數時,進入函數前預先將對象使用的棧空間保留出來,并將實參對象中的數據復制到棧空間保留出來,并將實參對象中的數據復制到棧空間中。該棧空間作為函數參數,用于函數內部使用。同理對象作為返回值時,進入函數后將申請返回對象使用的棧空間,在退出函數時,將返回對象中的數據復制到臨時的棧空間中,以這個臨時棧空間的首地址作為返回值。
CMyString MyString ;
MyString=GetMystring()
這里我主要把那個 返回對象 臨時對象 對象objA 圈了起來,因為這里有個賦值(拷貝)流程(這里的拷貝并未調用到拷貝構造函數,這里拷貝的意思是匯編層面的拷貝)詳情的話可以私下了解一下匯編代碼,然后看起來會受益匪淺,首先
返回對象---->臨時對象
臨時對象----->對象objA
在GetCReturn中,有個局部對象,局部對象拷貝(依然是匯編層面的拷貝)到返回對象中,
這里大家會不會在想,直接把局部對象拷貝給臨時對象不就得了嘛?為什么還得局部對象到返回對象,返回對象到臨時對象。這里按照我的理解是:
因為傳過來的返回對象的地址和局部對象的地址是不一樣的,返回對象拷貝到臨時對象這個操作是在
call完GetCReturn函數后進行拷貝(由地址4012BA以下可知),此時才能有效開辟臨時空間(因為在GetCReturn內開辟臨時空間,函數結束后,空間也就沒了,相當于開辟了個寂寞),所以在函數內部根本不可能找到一個臨時空間來用,只能到先傳遞給返回對象,讓返回對象在函數外來找一個臨時空間進行拷貝,照這里的操作,感覺這個返回對象的生命周期應該會比函數內的局部對象生命周期長那么一點點
接上上面的流程就是
局部對象---->返回對象
返回對象---->臨時對象
臨時對象----->對象objA
(疑問點:返回對象的空間是在main函數里開辟(結合地址401293以及地址4012AE可看出)的,生命周期相比局部對象更長,為什么要使用局部對象來賦值?直接用返回對象來賦值,不是更簡便嗎?還可以省了一次拷貝)
但是我感覺這個返回對象的生命周期挺長的呀
總結
以上是生活随笔為你收集整理的返回对象1(未调用拷贝构造函数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对象作为函数参数
- 下一篇: 返回对象2(调用了拷贝构造函数)