反彙編解析 define和const的區別

2021-06-12 20:34:20 字數 1224 閱讀 2084

#define是乙個真常量,而const卻是由編譯器判斷實現的常量,嚴格來說是乙個偽常量;

在實際中,由const定義的常量其實仍然是乙個變數,只是編譯器在編譯過程中進行了檢查,發現修改就會報錯;

如果利用指標得到const int變數的位址,然後根據位址強制改變這個變數的值會有什麼情況呢?編譯器會不會報錯?

變數值會不會改變?

c++**如下:

void main()

001    

很遺憾,結果輸出為:5

當程式執行到004的時候我們開啟除錯裡的variables表:

知道其實nvar的值已經被改動;

繼續執行到0005

可以發現雖然nvar的值早已修改為7,但是通過004語句的賦值並沒有使得_cgd=7;

這是因為nvar的值是已經確定的;雖然你可以通過記憶體修改它的值,改變這個變數在記憶體中的二進位制序列;但是

凡是以後**中有nvar的出現,

一律會被編譯器優化為初始值,也就是:5;而並不是將當前的nvar實際值進行賦值;

將上述c++**反彙編:

12:   void main()

13:  

0040161e 5f                   pop         edi

0040161f 5e                   pop         esi

00401620 5b                   pop         ebx

00401621 83 c4 4c             add         esp,4ch

00401624 3b ec                cmp         ebp,esp

00401626 e8 75 f3 01 00       call        __chkesp (004209a0)

0040162b 8b e5                mov         esp,ebp

0040162d 5d                   pop         ebp

0040162e c3                   ret

const和define的區別以及const的優點

1 就起作用的階段而言 define是在編譯的預處理階段起作用 在預處理階段進行替換 而const是在編譯執行的時候起作用 const修飾的唯讀變數是在編譯的時候確定其值 2 就起作用的方式而言 define只是簡單的字串替換,沒有型別檢查。而const有對應的型別,是要進行判斷的,可以避免一些低階...

C 反彙編揭秘1 乙個簡單的C 程式反彙編解析

本系列主要從彙編角度研究c 語言機制和彙編的對應關係。第一篇自然應該從最簡單的開始。c 的源 如下 class my class void method int n my class private int m member int tmain int argc,tchar argv 可以直接deb...

C 虛函式呼叫的反彙編解析

虛函式的呼叫如何能實現其 虛 作為c 多型的表現手段,估計很多人對其實現機制感興趣。大約一般的教科書就說到這個c 強大機制的時候,就是教大家怎麼用,何時用,而不會去 一下這個虛函式的真正實現細節。當然,因為不同的編譯器廠家,可能對虛函式有自己的實現,呵呵,這就算是虛函式對於編譯器的 多型 了 作為編...