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