用彙編的眼光看C (之class構造 析構)

2021-05-28 08:40:17 字數 1334 閱讀 4625

(1)如果沒有建構函式、析構函式呢?

view plain

class

};  

view plain

67:       a.print();  

00401248   lea         ecx,[ebp-4]  

68:       return

;  69:   }  

我們看到,堆疊分配了四個位元組空間給a,就是ebp下面的乙個位元組。

(2) 析構函式什麼時候呼叫?

view plain

class

);}  

void

print() 

const

};  

如果呼叫呢,我們可以做乙個測試環境,如下所示:

view plain

0040126d   lea         ecx,[ebp-10h]  

00401275   mov         dword ptr [ebp-4],0  

69:         

00401284   lea         ecx,[b]  

0040128c   mov         dword ptr [ebp-4],0ffffffffh  

72:   }  

00401293   lea         ecx,[ebp-10h]  

0040129b   mov         ecx,dword ptr [ebp-0ch]  

0040129e   mov         dword ptr fs:[0],ecx  

我們看到,只要出了作用域,析構函式就會自動會被呼叫。

(3)如果是new呼叫類,析構函式會自動呼叫嗎?

不會。(4)建構函式、析構函式的本質?

我們知道在函式中的臨時變數在堆疊裡面應用的時候都需要初始化處理的,在堆疊返回的時候會被自動收回。那麼建構函式和析構函式?其實是一樣的,在函式呼叫的時候,堆疊也會為這樣乙個類準備大小合適的堆疊,然後呼叫建構函式對這樣的一片記憶體進行初始化處理,在函式return的時候,呼叫另外乙個函式對可能涉及到的資源進行一次清理。這裡指的資源不是指記憶體空間,而是指廣義意義上的系統資源、比如說io、socket、鎖、畫筆、對話方塊控制代碼等等。所以,通常而言,如果你在析構函式裡面沒有及時對資源進行分配,那麼就會造成資源的洩露。這一切只有等到程式結束的時候才會重新回到系統的手中,不過如果乙個程式占有太多的資源,那麼勢必會對別的程式造成影響。

用彙編的眼光看C (之class構造 析構)

1 如果沒有建構函式 析構函式呢?67 a.print 00401248 lea ecx,ebp 4 68 return 69 我們看到,堆疊分配了四個位元組空間給a,就是ebp下面的乙個位元組。2 析構函式什麼時候呼叫?如果呼叫呢,我們可以做乙個測試環境,如下所示 0040126d lea ecx...

用彙編的眼光看C (之class構造 析構)09

1 如果沒有建構函式 析構函式呢?cpp view plain copy class cpp view plain copy 67 a.print 00401248 lea ecx,ebp 4 68 return 69 我們看到,堆疊分配了四個位元組空間給a,就是ebp下面的乙個位元組。2 析構函式...

用彙編的眼光看C (之嵌入彙編)

嵌入式彙編是對純彙編檔案的一種有益補充。通常會有下面幾種情況使用到彙編 1 提高 的工作效率 使用到cpu的一些特殊指令,比如說mmx指令 2 對硬體進行某種特殊的操作,比如說關中斷等,這在核心級的 中是比較常見的。但是我們講究嵌入式彙編的一些基本點和大家一起討論一下,建議大家和我一起做實驗,用事實...