⑴ C++運行時內存分為幾個區啊
在C++中,內存分成5個區,他們分別是堆、棧、自由存儲區、全局/靜態存儲區和常量存儲區。
1.棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的存儲區。裡面的變數通常是局部變數、函數參數等。
2.堆,就是那些由new分配的內存塊,他們的釋放編譯器不去管,由用戶的應用程序去控制,一般一個new就要對應一個delete。如果程序員沒有釋放掉,那麼在程序結束後,操作系統會自動回收。
3.自由存儲區,就是那些由malloc等分配的內存塊,它和堆是十分相似的,不過它是用free來結束自己的生命的。
4.全局/靜態存儲區,全局變數和靜態變數被分配到同一塊內存中,在以前的c語言中,全局變數又分為初始化的和未初始化的,在C++裡面沒有這個區分了,他們共同佔用同一塊內存區。
5.常量存儲區,這是一塊比較特殊的存儲區,他們裡面存放的是常量,不允許修改。
⑵ c++全局/靜態存儲區和常量存儲區是一樣的嗎
當然不一樣,下面詳細講解一下內存分配的幾個區:
棧:
就是那些由編譯器在需要的時候分配,
在不需要的時候自動清除的變數的存儲區。
裡面的變數通常是局部變數、函數參數等。
在一個進程中,位於用戶虛擬地址空間頂部
的是用戶棧,編譯器用它來實現函數的調用。
和堆一樣,用戶棧在程序執行期間可以動態地擴展和收縮。
堆:
就是那些由new分配的內存塊,他們的釋放編譯器不去管,
由我們的應用程序去控制,一般一個new就要對應一個delete。
如果程序員沒有釋放掉,那麼在程序結束後,操作系統會自動回收。
堆可以動態地擴展和收縮。
自由存儲區,
就是那些由malloc等分配的內存塊,他和堆是十分相似的,
不過它是用free來結束自己的生命的。
全局/靜態存儲區,
全局變數和靜態變數被分配到同一塊內存中,
在以前的C語言中,全局變數又分為初始化的
和未初始化的(初始化的全局變數和靜態變數在一塊區域,
未初始化的全局變數與靜態變數在相鄰的另一塊區域,
同時未被初始化的對象存儲區可以通過void*來訪問和操縱,
程序結束後由系統自行釋放),在C++裡面沒有這個區分了,
他們共同佔用同一塊內存區。
常量存儲區,
這是一塊比較特殊的存儲區,他們裡面存放的是常量,不允許修改
⑶ 字元串常量一般放在內存的靜態區嗎
這個不好說,不能明確說它放在什麼地方,給你舉個例子吧,用指針來舉個例子
定義一個字元串常量:char* p = "what are doing?"
那麼在這句話中,p和 "what are doing?"這兩個是不在一個存儲區上的,不過我認為字元串常量應該是存儲在正文段和數據段之間,也有人說是放在靜態存儲區上,也有人說是放在rodata 只讀數據段上,你可以自己從gdb上看一下。這里我給你一點資料你理解一下,我們一塊學習啊
這里是幾個存放數據的內存段:
1)正文段——CPU執行的機器指令部分;一個程序只有一個副本;只讀,防止程序由於意外事故而修改自身指令;
2)初始化數據段(數據段)——在程序中所有賦了初值的全局變數,存放在這里。
3)非初始化數據段(bss段)——在程序中沒有初始化的全局變數;內核將此段初始化為0。
4)棧——增長方向:自頂向下增長;自動變數以及每次函數調用時所需要保存的信息(返回地址;環境信息)。
5)堆——動態存儲。
這里還有一段有個高人寫的一段小程序,很詳細的
//main.cpp
int a = 0; 全局初始化區
char *p1; 全局未初始化區
main()
{
int b; 棧
char s[] = "abc"; 棧
char *p2; 棧
char *p3 = "123456"; 123456\0在常量區,p3在棧上。
static int c =0; 全局(靜態)初始化區
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得來得10和20位元組的區域就在堆區。
strcpy(p1, "123456"); 123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"
優化成一個地方。
}
⑷ c語言常量變數在內存中的存儲方式
從靜態存儲區域分配:內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變數,static變數。
在棧上創建(地址從大到小):在執行函數時,函數內局部變數的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置於處理器的指令集中,效率很高,但是分配的內存容量有限。(棧上的變數都具有臨時變數的特性)
從堆上分配(地址從小到大):亦稱動態內存分配。程序在運行的時候用malloc或new申請任意多少的內存,程序員自行負責在何時用free或delete釋放內存。
(4)常量區靜態存儲區擴展閱讀:
注意事項:
const在C語言中使用比較多,雖然變數由const修飾,但是從本質上仍然是變數,所以存儲在堆棧和靜態存儲區,這么區域從進程角度來講是可讀可寫,但為什麼const修飾後將變得不可寫了。
既然const變數所在區域的屬性為可讀可寫,那麼可以修改其所處內存的值了。
C語言const變數的作用說起:const是一個c語言的關鍵字,限定一個變數不允許被改變,產生靜態作用。使用const在一定程度上可以提高程序的安全性和可靠性。另外在觀看別人代碼的時候,清晰理解const所起的作用,對理解對方的程序也有一些幫助。
⑸ C語言運行的內存要求是哪三個是不是程序代碼區,靜態存儲區和動態存儲區。求高人路過
一個由c/C++編譯的程序佔用的內存分為以下幾個部分
1、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧。2、堆區(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表,呵呵。3、全局區(靜態區)(static)—,全局變數和靜態變數的存儲是放在一塊的,初始化的全局變數和靜態變數在一塊區域, 未初始化的全局變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程序結束後有系統釋放 4、文字常量區—常量字元串就是放在這里的。 程序結束後由系統釋放5、程序代碼區—存放函數體的二進制代碼。
⑹ 常量存儲區和靜態存儲區有什麼區別 static const int a=10;是存到常量存儲區還是靜態存儲區
如樓上所說,常量存儲區裡面的數據是放在代碼段里的,不佔內存。靜態存儲區是在內存空間中的,在其所屬的類(或文件)中是全局的。
c語言中const好像沒有用處。
static const int a=10;我個人認為是存到靜態區的。你可以上網搜一下static const修飾的變數是如何賦初值的,一般有兩種方法。一是定義時直接賦初值,二是類外賦初值。而常量是無法用這兩種方法賦初值的。
⑺ 靜態存儲區和常量存儲區有什麼區別
一、靜態存儲區和常量存儲區的區別:
1、靜態存儲區,全局變數和靜態變數被分配到同一塊內存中;常量存儲區,這是一塊比較特殊的存儲區,他們裡面存放的是常量,是不允許修改的。
2、靜態存儲是main函數運行前分配內存並初始化;常量存儲是固化在執行文件上的數據。棧的方向和平台有關,一般來說,windows由高地址向低地址增長,linux相反,但linux演變出來的操作系統不排除有特殊情況。
3、常量存儲區裡面的數據是放在代碼段里的,不佔內存。靜態存儲區是在內存空間中的,在其所屬的類(或文件)中是全局的
二、靜態存儲區和常量存儲區介紹
1、靜態存儲區:所有的靜態對象,全局對象都於靜態存儲區分配,全局變數和靜態變數被分配到同一塊內存中,在以前的 C 語言中,全局變數又分為初始化的和未初始化的(初始化的全局變數和靜態變數在一塊區域,未初始化的全局變數與靜態變數在相鄰的另一塊區域,同時未被初始化的對象存儲區可以通過 void* 來訪問和操縱,程序結束後由系統自行釋放),在 C++ 裡面沒有這個區分了,他們共同佔用同一塊內存區。
2、常量存儲區:這是一塊比較特殊的存儲區,他們裡面存放的是常量,不允許修改
三、注意事項:常量字元串都存放在靜態存儲區,返回的是常量字元串的首地址.