1. 程式人生 > >C++編程中const和#define的區別

C++編程中const和#define的區別

程序 存在 pan best color 普通 分配 一次 def



(1) 編譯器處理方式不同
  define宏是在預處理階段展開。
  const常量是編譯運行階段使用。
(2) 類型和安全檢查不同
  define宏沒有類型,不做任何類型檢查,僅僅是展開。
  const常量有具體的類型,在編譯階段會執行類型檢查。
(3) 存儲方式不同
  define宏僅僅是展開,有多少地方使用,就展開多少次,不會分配內存。
  const常量會在內存中分配(可以是堆中也可以是棧中)。
(4)const 可以節省空間,避免不必要的內存分配。 例如:
1 #define PI 3.14159 //常量宏  
2 const doulbe Pi=3.14159; //此時並未將Pi放入ROM中 ......  
3 double i=Pi; //此時為Pi分配內存,以後不再分配! 4 double I=PI; //編譯期間進行宏替換,分配內存 5 double j=Pi; //沒有內存分配 6 double J=PI; //再進行宏替換,又一次分配內存!
 const定義常量從匯編的角度來看,只是給出了對應的內存地址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程序運行過程中只有一份拷貝,而 #define定義的常量在內存中有若幹個拷貝。 
(5) 提高了效率。 編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。
(6) 有些集成化的調試工具可以對const常量進行調試,但是不能對宏常量進行調試。

C++編程中const和#define的區別