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

2022-03-24 15:23:53 字數 2115 閱讀 8496

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

(1)普通變數的保護

[cpp]view plain

copy

const

intdata = 10;  

const

char

str = 

'a';  

const

double

pi = 3.14;  

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

(2)位址空間的保護

[cpp]view plain

copy

void

process()  

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

[cpp]view plain

copy

class

desk  

~desk() {}  

};  

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

(4)類const函式

[cpp]view plain

copy

class

desk  

~desk() {}  

void

print()   

void

print() 

const

};  

[cpp]view plain

copy

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,我們可以繼續跟進去看一下:

[cpp]view plain

copy

00401046   jmp         desk::print (00401310)  

0040104b   jmp         desk::print (004012e0)  

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

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

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

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

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

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