By SmartPtr(http://www.shnenglu.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 閱讀(1137)
評論(5) 編輯 收藏 引用