為什么可以返回結構體指針或臨時對象呢?
首先說明一個問題,雖然返回值在函數內部聲名并且使用,但函數返回值在返回前從原變量進行數據的轉移,這是因為函數調用完畢,其棧要進行回收,這時棧里面的內存變值雖然還可以訪問,但其已經標記為回收(因為函數返回后或調用完畢后esp棧進行了平衡,關于函數調用方式,我錄了一個視頻,你可以點擊查看)。
下面我們來說一下函數的返回值,在返回時這個值的轉移問題:
當函數的返回值類型為基本數據類型時(雙精度浮點型以及非標準的__int64類型除外)作為返回值時,通過寄存器eax來保存返回的數據,而對構體或者類對象等復雜數據屬于自定義類型,寄存器eax無法保存對象中的所有數據,所以在函數返回時,寄存器eax無法滿足需求。
對于寄存器eax無法保存返回的數據類型時,在函數調用前,編譯器會預先將要返回的數據內存空間使用的棧(注意,這里是調用者的棧空間預留)保留出來,這樣當函數在退出時,將返回值的數據復制到預先分配的內存棧空間,以這個臨時空間的首地址作為首地址作為返回值。由于這個臨時空間是調用者函數內部的棧空間,所以說是可用的。
下面我將一段代碼為例:
以下為代碼的反匯編,注釋很詳細,如果有不明白的可以私信我
本人最近一直在做一些c/c++語言反匯編的視頻,以反匯編的方式揭密C/C++語言的本質,如果有興趣,可以關注我。
最后,希望我的回答能令你滿意。
上一篇家用電腦如何綁定域名?
下一篇唐山十大高檔小區排名?