常量有沒有儲存空間,或者只是編譯時的符號而已?
不一定。
在c中,define常量是預處理階段的工作,其不佔據記憶體。但是const常量總是佔據記憶體
在c++中,const常量是否佔據儲存空間取決於是否有引用該常量位址的**。c++對於const預設為內部鏈結,因此const常量定義通常都放在標頭檔案中,即使分配記憶體也不會出現鏈結錯誤。
若不引用常量對應的位址,則不會為其分配空間。
const是用來替換define
的,因此其必須能夠放在標頭檔案中,在c++中const變數是預設為內部鏈結的,即在其他檔案中看不到本檔案定義的const變數,因此鏈結不會出現問題。const變數在定義的時候必須初始化,除非顯式的指定其為extern的。通常c++中會盡量避免為const變數分配記憶體storage
的,而是在編譯階段將其儲存在符號表symbol table中。當用extern修飾const變數或引用其位址時,將強制為其分配記憶體,因為extern表示採用外部鏈結,因此其必須有某個位址儲存其值。
#include
const int i=100; //無法找到i的符號,因為沒有為其分配儲存空間。
const int j=i+100; //強迫編譯器為常量分配儲存空間
long address=(long)&j;
char buf[j+10];
int main(int argc, char* argv)
const記憶體分配
常量有沒有儲存空間,或者只是編譯時的符號而已?不一定。在c中,define常量是預處理階段的工作,其不佔據記憶體。但是const常量總是佔據記憶體 在c 中,const常量是否佔據儲存空間取決於是否有引用該常量位址的 c 對於const預設為內部鏈結,因此const常量定義通常都放在標頭檔案中,即使...
const唯讀變數的記憶體分配
編譯器通常不為普通 const 唯讀變數分配儲存空間,而是將它們儲存在符號表中,這使 得它成為乙個編譯期間的值,沒有了儲存與讀記憶體的操作,使得它的效率也很高。例如 define m 3 巨集常量 const int n 5 此時並未將 n 放入記憶體中 int i n 此時為 n 分配記憶體,以後...
關於const和define的記憶體分配問題的總結
1,const定義的唯讀變數在程式執行過程中只有乙份拷貝 因為它是全域性的唯讀變數,存放在靜態區 而 define定義的巨集常量在記憶體中有若干個拷貝。2,define巨集是在預編譯階段進行替換,而const修飾的唯讀變數是在編譯的時候確定其值。3,define巨集沒有型別,而const修飾的唯讀變...