初识C++之剖析const与#define
1、 編譯器處理方式不同
#define是一個宏定義命令,它是在預處理階段就進行了替換;
const修飾的是一個編譯時常量,它是在編譯階段處理的。
2、 類型和安全檢查不同
#define定義的標識符僅僅是產生文本替換,不管內容是否正確;
const修飾的符號是一個具有類型的符號,編譯器在編譯時會對其做嚴格的檢查。
3、書寫方式不同
#define是一個預處理命令,結束時沒有分號;
const定義常量是一個說明語句,以分號結束。
4、 存儲方式不同
#define宏僅僅是展開,有多少地方使用,就展開多少次,不會分配內存。
const常量會在內存中分配(可以是堆中也可以是棧中)。
5、const 可以節省空間,避免不必要的內存分配。
例如:
#define PI 3.14159 //常量宏
const doulbe Pi=3.14159; //此時并未將Pi放入內存中 ……
double i=Pi; //此時為Pi分配內存,以后不再分配!
double I=PI; //編譯期間進行宏替換,分配內存
double j=Pi; //沒有內存分配
double J=PI; //再進行宏替換,又一次分配內存!
const定義常量從匯編的角度來看,只是給出了對應的內存地址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程序運行過程中只有一份拷貝,而 #define定義的常量在內存中有若干個拷貝。
6、作用域
#define定義的常量,盡管在某個函數內,但他的作用域是從定義開始,直到遇到#undef取消其定義為止,要是不取消,就會直到文件結束;
const定義的變量,要是在函數內,那么它的作用域就是它定義開始,到它所在的復合語句結束為止。
7、提高了效率。
編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。
8、 調試
有些集成化的調試工具可以對const常量進行調試,但是不能對#define修飾的宏常量進行調試。
總結
以上是生活随笔為你收集整理的初识C++之剖析const与#define的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言实现静态顺序表
- 下一篇: c++ 如何确认网卡为无线网卡_笔记本无