用彙編的眼光看C (之拷貝 賦值函式)

2021-06-16 07:17:39 字數 1921 閱讀 4587

拷貝建構函式和複製函式是類裡面比較重要的兩個函式。兩者有什麼區別呢?其實也很簡單,我們可以舉個例子,加入有這樣乙個類的定義:};

那麼我們在如下的函式裡面進行呼叫的時候,呼叫的函式分別是哪些呢?

void process()

其實彙編的結果是這樣的,大家可以一起看一下,自己嘗試讀一下。如果一次不是很明白,可以多讀幾次。

0040127d lea ecx,[ebp-10h]

00401285 mov dword ptr [ebp-4],0

0040128c lea ecx,[ebp-14h]

00401294 mov byte ptr [ebp-4],1

00401298 lea eax,[ebp-10h]

0040129b push eax

0040129c lea ecx,[ebp-18h]

004012a4 mov byte ptr [ebp-4],2

72: c = b;

004012a8 lea ecx,[ebp-18h]

004012ab push ecx

004012ac lea ecx,[ebp-14h]

73: }

004012b4 mov byte ptr [ebp-4],1

004012b8 lea ecx,[ebp-18h]

004012c0 mov byte ptr [ebp-4],0

004012c4 lea ecx,[ebp-14h]

004012cc mov dword ptr [ebp-4],0ffffffffh

004012d3 lea ecx,[ebp-10h]

004012db mov ecx,dword ptr [ebp-0ch]

004012de mov dword ptr fs:[0],ecx

004012e5 pop edi

004012e6 pop esi

004012e7 pop ebx

004012e8 add esp,58h

004012eb cmp ebp,esp

004012ed call __chkesp (004087c0)

004012f2 mov esp,ebp

004012f4 pop ebp

004012f5 ret

(2)71句:通過對應看到了eax記錄了引用變數的位址,而ecx是ebp下面緊挨著四個位元組。但是函式呼叫的位址和前面的預設建構函式不太一樣,所以我們大膽猜測,這裡的建構函式這是拷貝建構函式,我們可以在除錯的時候檢視一下列印訊息。

(3)72句:0x4012af語句已經清楚地告訴了我們,這裡呼叫的函式就是operator=函式,這一部分是算術符過載的內容,我們在後面的部落格會重點介紹。

(4)73句: 前面我們講過,析構函式在函式呼叫結束的時候被被自動呼叫,那麼這裡我們看到卻是出現了三個呼叫?這三個變數正好是我們之前說的a、b、c三個變數。那麼這三個變數呼叫的次序是怎樣的呢?我們可以檢視一下變數的位址,分別是【ebp-18h】、【ebp-14h】、【ebp-10h】,這正好和變數出現的順序相反。所以我們看到,析構函式和建構函式是嚴格一一對應的,誰先出現,誰後析構。

【預告: 下面的部落格我們會對構造、析構中出現的一些現象進行總結】

用彙編的眼光看C (之拷貝 賦值函式)

拷貝建構函式和複製函式是類裡面比較重要的兩個函式。兩者有什麼區別呢?其實也很簡單,我們可以舉個例子,加入有這樣乙個類的定義 view plain class return this void print const 那麼我們在如下的函式裡面進行呼叫的時候,呼叫的函式分別是哪些呢?view plain...

用彙編的眼光看C (之拷貝 賦值函式)

拷貝建構函式和複製函式是類裡面比較重要的兩個函式。兩者有什麼區別呢?其實也很簡單,我們可以舉個例子,加入有這樣乙個類的定義 cpp view plain copy class return this void print const 那麼我們在如下的函式裡面進行呼叫的時候,呼叫的函式分別是哪些呢?c...

用彙編的眼光看C (之特殊函式)

這裡說的函式主要指的是inline函式 static函式。inline函式比較特殊,它既具有巨集的性質,同時也能讓編譯器對它進行函式檢查。static函式同樣也比較特殊,它只可以被同檔案的函式使用。如果static函式在include檔案中,那麼這個標頭檔案只要被使用一次,那麼這個函式就要在exec...