關於const和define的記憶體分配問題的總結

2022-03-29 22:09:24 字數 1750 閱讀 8490

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

關於 define 和const 的問題

小生在寫 cuda 程式時遇到的乙個問題就是 對 define 和const 有疑問到底哪個執行的速度更加快一些呢 define 一般來說用於 字串 string 和數字的 替代,預設區分大小寫 我們將這個 define 又稱做巨集 所有叫做巨集的都有乙個特點就是,它是在預處理時的文字替換,替換了之...

const和define的區別

1 編譯器處理方式不同 define巨集是在預處理階段展開。const常量是編譯執行階段使用。2 型別和安全檢查不同 define巨集沒有型別,不做任何型別檢查,僅僅是展開。const常量有具體的型別,在編譯階段會執行型別檢查。3 儲存方式不同 define巨集僅僅是展開,有多少地方使用,就展開多少...

const和 define的區別

1 const定義的常量是有型別的,define定義的常量是沒有型別的 這就意味著會對前者做乙個型別的檢查,對 define則是做乙個簡單的替換 2 const定義的常量在編譯的時候分配記憶體,而 define定義的常量在預編譯的時候進行替換,不分配記憶體 3 作用域不同,const定義的常變數的作...