從c到c++的升級包括關(guān)鍵字、內(nèi)存空間的分配、引用、函數(shù)、命名空間等等
包括register關(guān)鍵字及const關(guān)鍵字
- register 在c語言中,register關(guān)鍵字的意思是: 1、將局部變量存放在寄存器中。 2、所以想要對這個局部變量取地址時,不能夠得到這個變量在內(nèi)存中的地址。 在c++中,register關(guān)鍵字的意思是: 1、在c++編譯器中,即使不用register關(guān)鍵字也可以實行優(yōu)化 2、當(dāng)對這個變量取地址時,可以得到這個變量在內(nèi)存的地址
- const 在c語言中,const關(guān)鍵字的意思是: 1、被修飾的變量成為只讀變量 2、在定義的時候必須初始化 3、不可以通過變量名來改變變量的值,但可以通過別的方法來改變變量的值,如下
const int num = 5;int *p = #(*p)++;在c++中 1、遇見常量聲明時,在符號表中放入常量。//問:什么是符號表 符號表有哪些重要作用?//答:符號表在編譯程序工作的過程中需要不斷收集、記錄和使用源程序中一些語法符號的類型和特征等相關(guān)信息。這些信息一般以表格形式存儲于系統(tǒng)中。如常數(shù)表、變量名表、數(shù)組名表、過程名表、標(biāo)號表等等,統(tǒng)稱為符號表。對于符號表組織、構(gòu)造和管理方法的好壞會直接影響編譯系統(tǒng)的運行效率。2、編譯過程中,若是遇到使用這個常量,則直接用符號表中的值替換 3、編譯過程中,若是發(fā)現(xiàn)對這個常量進(jìn)行了extern或者是&操作符,則給這個常量分配對應(yīng)的存儲空間
//ps://雖然會給這個常量分配空間,但是不會使用這個空間里面的值const只能對const非const只能對應(yīng)非const決不能const對應(yīng)非const//如:const int num = 5;//想要用一個指針指向num的地址const int *p = #const和define的不同 (1) 編譯器處理方式不同 define宏是在預(yù)處理階段展開。 const常量是編譯運行階段使用。 (2) 類型和安全檢查不同 define宏沒有類型,不做任何類型檢查,僅僅是展開。 const常量有具體的類型,在編譯階段會執(zhí)行類型檢查。 (3) 存儲方式不同 define宏僅僅是展開,有多少地方使用,就展開多少次,不會分配內(nèi)存。(宏定義不分配內(nèi)存,變量定義分配內(nèi)存。) const常量會在內(nèi)存中分配(可以是堆中也可以是棧中)。 (4)const 可以節(jié)省空間,避免不必要的內(nèi)存分配。 例如:
#define PI 3.14159 //常量宏 const doulbe Pi=3.14159; //此時并未將Pi放入ROM中 ...... double i=Pi; //此時為Pi分配內(nèi)存,以后不再分配! double I=PI; //編譯期間進(jìn)行宏替換,分配內(nèi)存 double j=Pi; //沒有內(nèi)存分配 double J=PI; //再進(jìn)行宏替換,又一次分配內(nèi)存!const定義常量從匯編的角度來看,只是給出了對應(yīng)的內(nèi)存地址,而不是象#define一樣給出的是立即數(shù),所以,const定義的常量在程序運行過程中只有一份拷貝(因為是全局的只讀變量,存在靜態(tài)區(qū)),而 #define定義的常量在內(nèi)存中有若干個拷貝。 (5) 提高了效率。 編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內(nèi)存的操作,使得它的效率也很高。 (6) 宏替換只作替換,不做計算,不做表達(dá)式求解; 宏預(yù)編譯時就替換了,程序運行時,并不分配內(nèi)存。
const 與 #define的比較 C++ 語言可以用const來定義常量,也可以用 #define來定義常量。但是前者比后者有更多的優(yōu)點: (1) const常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型。編譯器可以對前者進(jìn)行類型安全檢查。而對后者只進(jìn)行字符替換,沒有類型安全檢查,并且在字符替換可能會產(chǎn)生意料不到的錯誤(邊際效應(yīng))。 (2) 有些集成化的調(diào)試工具可以對const常量進(jìn)行調(diào)試,但是不能對宏常量進(jìn)行調(diào)試。
新聞熱點
疑難解答
圖片精選