1. 程式人生 > >答學弟問之變數與記憶體問題

答學弟問之變數與記憶體問題

By SmartPtr(http://www.cppblog.com/SmartPtr/)
 
 今天收到學弟的一封信,問我關於變數與記憶體的一些問題,其實這是一個很基本的概念,但可能還有很多人對這個還不太瞭解(包括自己可能也會有誤解的地方),遂將原信與回信放於此:
  
原信
問幾個我比較混亂的問題。
看一下我寫的對不對
int g_variable; //佔編譯後的程式碼空間,執行時佔記憶體(常住記憶體)
const int c_value = 5;    //佔編譯後的程式碼空間, 是不是常住記憶體呢?
void fun(void)
{
static int s_variable;    //佔編譯後的程式碼空間,執行時佔記憶體(常住記憶體)
int variable;    //fun 被呼叫時放入棧中(佔用記憶體)
}
如果我定義一下大一點的陣列,如:
const int c_array[100] = ...;
程式一執行時就會被分配 400 Byte 的記憶體空間嗎?還是在我使用它時會被分配400 Byte 的記憶體空間嗎?

回信

先給你大概講一下基本概念, 問題在原信下用紅色回答
 
一個程式的執行起來後,其在記憶體中有5個區域
1. 程式程式碼區
這個很簡單,存放執行指令,程式碼要執行,肯定要載入進記憶體, 我們不必關心。
 
2. 文字常量區
一般我們這樣定義一個字串時,其是在文字常量區的:
char* s1 = "hello, world";
char* s2 = "hello, world";
if(s1 == s2)
  printf("s1和s2指向同一個在文字常量區的字串");
 
這裡, s1和s2指向的是同一個字串
 
3. 靜態儲存區
全域性變數,靜態變數會放在這個區域,事實上,全域性變數也是靜態的。
 
以上1,2,3三個區域的記憶體在程式起來的時候就開闢好了的。
 
4. 棧

區域性變數就是在棧裡的。另外,函式呼叫時的引數也是在棧裡的,這個現在不必關心
 
5. 堆
malloc或new出來的記憶體就是在堆裡的,需要程式設計師自己管理清除。


**********原信***************************************************

問幾個我比較混亂的問題。
看一下我寫的對不對
 
int g_variable; //佔編譯後的程式碼空間,執行時佔記憶體(常住記憶體)
[Huang]屬於3,程式一執行就佔記憶體,知道程式退出才釋放
 
const int c_value = 5;    //佔編譯後的程式碼空間, 是不是常住記憶體呢?
[Huang]其實這個與是否const無關,如果這句是全域性的,那麼同上,如果是區域性的,那麼屬於4

 
void fun(void)
{
static int s_variable;    //佔編譯後的程式碼空間,執行時佔記憶體(常住記憶體)
int variable;    //fun 被呼叫時放入棧中(佔用記憶體)
}
[Huang]第一句屬於3, 第二句屬於4
 
如果我定義一下大一點的陣列,如:
 
const int c_array[100] = ...;
 
程式一執行時就會被分配 400 Byte 的記憶體空間嗎?還是在我使用它時會被分配400 Byte 的記憶體空間嗎?
[Huang]還是那句話,是全域性的,那麼 程式一執行時就會被分配 400 Byte 的記憶體空間, 如果是區域性的,那麼在我使用它時會才會被分配400 Byte 的記憶體空間

你這裡多次提到const, 其實const與這個主題並沒有關係。的確,const與static宣告的全域性變數具有內部連結的特性,但是即使在每個obj裡都有一個此變數的拷貝,也不影響其記憶體在靜態區的分配。
posted on 2007-09-13 00:01 SmartPtr 閱讀(924) 評論(5)  編輯 收藏 引用