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

一、const和define的區別

(1)就起作用的階段而言:#define是在編譯的預處理階段起作用(在預處理階段進行替換),而const是在編譯運行的時候起作用(const修飾的只讀變量是在編譯的時候確定其值)

(2)就起作用的方式而言:#define只是簡單的字符串替換,沒有類型檢查。而const有對應的類型,是要進行判斷的,可以避免一些低級的錯誤

(3)就存儲方式而言:#define只是進行展開,有多少地方使用,就替換多少次。它定義的宏常量在內存中存若干個備份;const定義的只讀變量在程序中只有一份備份

(4)從代碼調試的方便程度而言:const常量可以進行調試的,define是不能進行調試的,因爲在預編譯階段就已經進行替換了

(5)就內存分配而言:編譯器通常不爲普通的const只讀變量分配存儲空間,而是將它們保存在符號表中,這使得它成爲一個編譯期間的值,沒有了存儲與讀內存的操作,使得它的效率也很高

#define M 3
const int N = 5;  //此時並未將N放入內存中

int i = N;此時爲N分配內存,以後不再分配
int l = M;//預編譯期間進行宏替換,分配內存
int j = N;//沒有內存分配
int J = M;//再進行宏替換,又一次分配內存

  const定義的只讀變量從彙編的角度來看,只是給出了對應的內存地址,而不是像#define一樣給出的是立即數,所以,const定義的只讀變量在程序運行過程中只有一份拷貝(因爲它是全局的只讀變量,存放在靜態區),而#define定義的宏常量在內存中有若干個拷貝。

二、const的優點

(1)const常量有數據類型,而宏常量沒有數據類型,編譯器可以對const進行類型安全檢查,而對後者只進行字符替換,沒有類型安全檢查,並且在字符替換可能會產生意料不到的錯誤

(2)有些集成化的調試工具可以對const常量進行調試,但是不能對宏常量進行調試

(4)const在內存中只存儲了一份,節省了空間,避免不必要的內存分配,提高了效率

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章