從彙編看c 中引數物件和區域性物件的析構順序

2021-09-01 02:26:43 字數 1284 閱讀 5363

下面是c++的原始碼:

class

x

};void

f(x x)

intmain()

下面是main函式的彙編碼:

_main    proc

;15 : int main()

xoreax, eax

movesp, ebp

popebp

ret0

_main endp

從上面可以看出,產生的臨時物件在函式呼叫完成退出後才呼叫析構函式。

下面是f函式的彙編碼:

?f@@yaxvx@@@z proc                    ;f;

9 : void f(x x)

lea ecx, dword ptr _x1$[ebp];

將區域性變數x1的首位址給ecx

call ??1x@@qae@xz ;

為x1呼叫析構函式

lea ecx, dword ptr _x$[ebp];

將引數物件的首位址給ecx

call ??1x@@qae@xz ;

為引數物件呼叫析構函式

movesp, ebp

popebp

ret0

?f@@yaxvx@@@z endp ;f

;function compile flags: /odtp

_text ends

;comdat ??1x@@qae@xz

_text segment

_this$ = -4;

size = 4

??1x@@qae@xz proc ;

x::~x, comdat

;_this$ = ecx

;6 : ~x() {}

push

ebp

movebp, esp

push

ecx

movdword ptr _this$[ebp], ecx

movesp, ebp

popebp

ret0

??1x@@qae@xz endp

從上面的**可以看出,引數物件和區域性物件都是在函式退出之前呼叫析構函式。並且引數物件在區域性物件呼叫析構函式之後再呼叫自己的析構函式。

C 中的陣列和區域性靜態物件

正像以前我說過的,我已經不下五次 以為 我理解陣列了,然而今天又一次發現自己無知。初學c的時候我把陣列當成指標看。明白了一些實現機制後,我開始把陣列當成乙個特殊的變數 我開始察看彙編剖析原理,理解逐步深入。可是,明白得越多,就會發現越多的特例。最終 我陷入了看似任意且繁雜的規則的迷宮。還是的回到定義...

從彙編看c 中臨時物件的析構時機

c 中,臨時物件一旦不需要,就會呼叫析構函式,釋放其占有的資源 而具名物件則是與建立的順序相反,依次呼叫析構函式。c 原始碼 class x x int main 對應的彙編碼 main proc 11 int main lea ecx,dword ptr x2 ebp 獲取x2的首位址,作為隱含引...

從彙編看c 中全域性物件和全域性變數

先來看c 原始碼 include using namespace std class x x x 1 全域性物件 int i 2 全域性變數 intmain 在 裡面定義了乙個全域性物件 和乙個全域性變數i,main函式什麼也不做。在定義全域性物件 處打乙個斷點,然後在vs2010裡面除錯,檢視物件...