1, const定義的唯讀變數在程式執行過程中只有乙份拷貝(因為它是全域性的唯讀變數,存放在靜態區),而#define定義的巨集常量在記憶體中有若干個拷貝。
2, #define巨集是在預編譯階段進行替換,而const修飾的唯讀變數是在編譯的時候確定其值。
3, #define巨集沒有型別,而const修飾的唯讀變數具有特定的型別。
總結:const節省了空間,避免了不必要的記憶體分配,同時提高了效率。編譯器通常不為普通的const唯讀變數分配儲存空間,而是將它們儲存在符號表中,這使得它成為乙個編譯期間的值,沒有了儲存與讀記憶體的操作,使得它的效率也很高。c++中是不太推薦用巨集的,盡量少用.因為c++是強型別的語言,希望通過型別檢查來降低程式中的很多錯誤,而巨集只是在編譯期前做簡單替換,繞過了型別檢查,失去了強型別系統的優勢支撐。
例如:#define m 3 //巨集常量
const int n=5; // 此時並未將n放入記憶體中
..............
int i=n; //此時為n分配記憶體,以後不再分配!
int i=m; //預編譯期間進行巨集替換,分配記憶體
int j=n; //沒有記憶體分配
int j=m; //再進行巨集替換,又一次分配記憶體!
原因:const定義的唯讀變數從彙編的角度來看,只是給出了對應的記憶體位址,而不是像#define一樣給出的是立即數,所以const定義的唯讀變數在程式執行過程中只有乙份拷貝。
在c++我們知道一般是採用const來進行替代#define的。
例如:const int n=3;//注意採用的是賦值的形式並且末尾有分號
#define n 3
在c中我們知道#define進行預定義的某個數是被分配記憶體的,其檔案在編譯預處理過程中就會用定義好的資料去替代文中的符號。
但是const卻是不一樣的,一般情況下編譯器也是不為const建立空間的,只是將這個定義的數字儲存在符號表中的。但是在下列幾種情況下編譯器會為const定義的常量分配記憶體的。
1.使用了extern頭
extern const int n=3;
因為使用了extern我們將可能在外部檔案使用n,而const預設的是內部鏈結,所以我們必須要為之分配記憶體的。
2.取位址操作
#include
using namespace std;
const int m=3;
int main()
3.const定義的常量未知的時候,這是#define無法實現的。
#include
using namespace std;
int main()
{const int b=cin.get();//此處const定義的b是未知的所以要為它分配記憶體,但是一旦分配就不可以改變的。
//但是如果讀者此處想在利用未知的const常量來定義陣列還是會報錯的。
//即int array[b]是不行的,因為編譯器在從上往下走的時候是要確定陣列的大小的
//但是採用new操作就不會報錯的int *array=new int(b);
cout 小生在寫 cuda 程式時遇到的乙個問題就是 對 define 和const 有疑問到底哪個執行的速度更加快一些呢 define 一般來說用於 字串 string 和數字的 替代,預設區分大小寫 我們將這個 define 又稱做巨集 所有叫做巨集的都有乙個特點就是,它是在預處理時的文字替換,替換了之... 1 編譯器處理方式不同 define巨集是在預處理階段展開。const常量是編譯執行階段使用。2 型別和安全檢查不同 define巨集沒有型別,不做任何型別檢查,僅僅是展開。const常量有具體的型別,在編譯階段會執行型別檢查。3 儲存方式不同 define巨集僅僅是展開,有多少地方使用,就展開多少... 1 const定義的常量是有型別的,define定義的常量是沒有型別的 這就意味著會對前者做乙個型別的檢查,對 define則是做乙個簡單的替換 2 const定義的常量在編譯的時候分配記憶體,而 define定義的常量在預編譯的時候進行替換,不分配記憶體 3 作用域不同,const定義的常變數的作...關於 define 和const 的問題
const和define的區別
const和 define的區別