用彙編的眼光看C (之const屬性)

2021-08-26 04:56:34 字數 1812 閱讀 7819

const是c/c++語言中的關鍵字,但是如果用的好,可以極大地提高**的健壯性。一般來說const使用的地方還是蠻多的,但是主要還是下面幾個地方:(1)普通變數的保護;(2)位址空間的保護;(3)類初始變數的宣告和保護;(4)類變數在函式中的保護。const的保護主要來自於編譯器層面,和程式的執行沒有關係。

(1)普通變數的保護

const int data = 10;

const char str = 'a';

const double pi = 3.14;

上面的**就是一組全域性變數的定義,如果在函式中變數發生了修改,那麼**就會編譯失敗。

(2)位址空間的保護

void process()

(3)類const成員變數的定義

class desk

~desk() {}

};

const成員變數 就是在類變數定義的時候前面新增const關鍵字。和普通的成員變數不一樣,const變數在建構函式中一定要初始化操作的。如果沒有const關鍵字,那麼在建構函式內部就無所謂是不是需要初始化了。

(4)類const函式

class desk

~desk() {}

void print()

void print() const

};

53: desk m;

0040122d lea ecx,[ebp-10h]

00401230 call @ilt+75(desk::desk) (00401050)

00401235 mov dword ptr [ebp-4],0

54: m.print();

0040123c lea ecx,[ebp-10h]

0040123f call @ilt+70(desk::print) (0040104b)

55: const desk n;

00401244 lea ecx,[ebp-14h]

00401247 call @ilt+75(desk::desk) (00401050)

0040124c mov byte ptr [ebp-4],1

56: n.print();

00401250 lea ecx,[ebp-14h]

00401253 call @ilt+65(desk::print) (00401046)

57: }

上面是一段函式呼叫的**。我們在53行和55行定義了desk型別的變數m和n。接著在54行和56行,我們分別利用兩個變數呼叫print函式進行處理,我們發現兩個呼叫的函式位址並不一樣,其中乙個是0x0040104b,另外乙個是0x00401046,我們可以繼續跟進去看一下:

00401046   jmp         desk::print (00401310)

0040104b jmp desk::print (004012e0)

這裡雖然是兩個跳轉函式,但是事實已經證明這裡的兩個函式確實是不一樣的,這也證明了我們的判斷是正確的。

用彙編的眼光看C (之const屬性)

const是c c 語言中的關鍵字,但是如果用的好,可以極大地提高 的健壯性。一般來說const使用的地方還是蠻多的,但是主要還是下面幾個地方 1 普通變數的保護 2 位址空間的保護 3 類初始變數的宣告和保護 4 類變數在函式中的保護。const的保護主要來自於編譯器層面,和程式的執行沒有關係。1...

用彙編的眼光看C (之const屬性)15

const是c c 語言中的關鍵字,但是如果用的好,可以極大地提高 的健壯性。一般來說const使用的地方還是蠻多的,但是主要還是下面幾個 地方 1 普通變數的保護 2 位址空間的保護 3 類初始變數的宣告和保護 4 類變數在函式中的保護。const的保護主要來自於編譯器層 面,和程式的執行沒有關係...

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

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