『壹』 c++全局/靜態存儲區和常量存儲區是一樣的嗎
當然不一樣,下面詳細講解一下內存分配的幾個區:
棧:
就是那些由編譯器在需要的時候分配,
在不需要的時候自動清除的變數的存儲區。
裡面的變數通常是局部變數、函數參數等。
在一個進程中,位於用戶虛擬地址空間頂部
的是用戶棧,編譯器用它來實現函數的調用。
和堆一樣,用戶棧在程序執行期間可以動態地擴展和收縮。
堆:
就是那些由new分配的內存塊,他們的釋放編譯器不去管,
由我們的應用程序去控制,一般一個new就要對應一個delete。
如果程序員沒有釋放掉,那麼在程序結束後,操作系統會自動回收。
堆可以動態地擴展和收縮。
自由存儲區,
就是那些由malloc等分配的內存塊,他和堆是十分相似的,
不過它是用free來結束自己的生命的。
全局/靜態存儲區,
全局變數和靜態變數被分配到同一塊內存中,
在以前的C語言中,全局變數又分為初始化的
和未初始化的(初始化的全局變數和靜態變數在一塊區域,
未初始化的全局變數與靜態變數在相鄰的另一塊區域,
同時未被初始化的對象存儲區可以通過void*來訪問和操縱,
程序結束後由系統自行釋放),在C++裡面沒有這個區分了,
他們共同佔用同一塊內存區。
常量存儲區,
這是一塊比較特殊的存儲區,他們裡面存放的是常量,不允許修改
『貳』 C語言中 局部變數和全局變數都是存儲在什麼區
C語言中局部變數存在棧里,全局變數存靜態存儲區。
局部變數在棧空間上分配,這個局部變數所在的函數被多次調用時,每次調用這個局部變數在棧上的位置都不一定相同。局部變數也可以在堆上動態分配,但是記得使用完這個堆空間後要釋放之。
全局變數全部存放在靜態存儲區,在程序開始執行時給全局變數分配存儲區,程序行完畢就釋放。在程序執行過程中它們占據固定的存儲單元,而不動態地進行分配和釋放;
(2)靜態存儲區和全局區擴展閱讀
C語言中局部變數和全局變數示例:
#include<stdio.h>
#include<malloc.h>
staticints1=0,s2=0,s3=0;//靜態變數放在靜態區
intg1=0,g2=0,g3=0;//全局變數放在靜態區
voidmain()
{
staticints4=0,s5=0,s6=0;<spanstyle="font-family:Arial,Helvetica,simsun,u5b8bu4f53;"></span>//靜態變數
inta1=0,a2=0,a3=0;<spanstyle="font-family:Arial,Helvetica,simsun,u5b8bu4f53;"></span>//局部變數放在棧區
charc1[]="aabb";//局部變數放在棧區
char*c2="aabb";//字元常量放在靜態區
char*m1=(char*)malloc(1);//堆區
char*m2=(char*)malloc(1);//堆區
char*m3=(char*)malloc(1);//堆區
printf("動態數據區 ");
printf("a1 a2 a3 ",&a1,&a2,&a3);
printf("c1 ",c1);
printf("m1 m2 m3 ",&m1,&m2,&m3);
printf("靜態數據區 ");
printf("s1 s2 s3 ",&s1,&s2,&s3);
printf("g1 g2 g3 ",&g1,&g2,&g3);
printf("s4 s5 s6 ",&s4,&s5,&s6);
printf("c2 ",c2);
}
『叄』 存儲地址由的到的,由高到高
**靜態存儲區域分配。**內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變數,static變數。
**在棧上創建。**在執行函數時,函數內局部變數的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置於處理器的指令集中,效率很高,但是分配的內存容量有限。
從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc或new申請任意多少的內存,程序員自己負責在何時用free或delete釋 放內存。動態內存的生存期由程序員決定,使用非常靈活,但如果在堆上分配了空間,就有責任回收它,否則運行的程序會出現內存泄漏,頻繁地分配和釋放不同大 小的堆空間將會產生堆內碎塊。
📝 2、程序的內存空間
C語言在內存中一共分為如下幾個區域,分別是:
內存棧區: 存放局部變數名;
內存堆區: 存放new或者malloc出來的對象;
常數區: 存放局部變數或者全局變數的值;
靜態區: 用於存放全局變數或者靜態變數;
代碼區:存放函數體的二進制代碼。
📝 3、區域的簡單解釋
棧區(stack)–由編譯器自動分配釋放 ,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧。
堆區(heap)–般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式類似於鏈表。
全局區(靜態區)(static)–全局變數和靜態變數的存儲是放在一塊的,初始化的全局變數和靜態變數在一塊區域(RW), 未初始化的全局變數和未初始化的靜態變數在相鄰的另一塊區域(ZI)。程序結束後有系統釋放
文字常量區–常量字元串就是放在這里的。 程序結束後由系統釋放 (RO)
程序代碼區–存放函數體的二進制代碼。 (RO)
📝 4、動態內存與靜態內存
靜態分配內存:是在程序編譯和鏈接時就確定好的內存。
動態分配內存:是在程序載入、調入、執行的時候分配/回收的內存。
📝 5、堆棧
堆和棧都是動態分配內存,兩者空間大小都是可變的。
Stack: 棧,存放Automatic Variables,按內存地址由高到低方向生長,其最大大小由編譯時確定,速度快,但自由性差,最大空間不大。
通常是用於那些在編譯期間就能確定存儲大小的變數的存儲區,用於在函數作用域內創建,在離開作用域後自動銷毀的變數的存儲區。通常是局部變數,函數參數等的存儲區。他的存儲空間是連續的,兩個緊密挨著定義的局部變數,他們的存儲空間也是緊挨著的。棧的大小是有限的。
Heap: 堆,自由申請的空間,按內存地址由低到高方向生長,其大小由系統內存/虛擬內存上限決定,速度較慢,但自由性大,可用空間大。
通常是用於那些在編譯期間不能確定存儲大小的變數的存儲區,它的存儲空間是不連續的,一般由==malloc(或new)函數來分配內存塊,並且需要用free(delete)==函數釋放內存。如果程序員沒有釋放掉,那麼就會出現常說的內存泄漏問題。需要注意的是,兩個緊挨著定義的指針變數,所指向的malloc出來的兩塊內存並不一定的是緊挨著的=,所以會產生內存碎片。另外需要注意的一點是,堆的大小幾乎不受限制,理論上每個程序最大可達4GB。
每個線程都會有自己的棧,但是堆空間是共用的。
『肆』 靜態存儲區和常量存儲區有什麼區別
一、靜態存儲區和常量存儲區的區別:
1、靜態存儲區,全局變數和靜態變數被分配到同一塊內存中;常量存儲區,這是一塊比較特殊的存儲區,他們裡面存放的是常量,是不允許修改的。
2、靜態存儲是main函數運行前分配內存並初始化;常量存儲是固化在執行文件上的數據。棧的方向和平台有關,一般來說,windows由高地址向低地址增長,linux相反,但linux演變出來的操作系統不排除有特殊情況。
3、常量存儲區裡面的數據是放在代碼段里的,不佔內存。靜態存儲區是在內存空間中的,在其所屬的類(或文件)中是全局的
二、靜態存儲區和常量存儲區介紹
1、靜態存儲區:所有的靜態對象,全局對象都於靜態存儲區分配,全局變數和靜態變數被分配到同一塊內存中,在以前的 C 語言中,全局變數又分為初始化的和未初始化的(初始化的全局變數和靜態變數在一塊區域,未初始化的全局變數與靜態變數在相鄰的另一塊區域,同時未被初始化的對象存儲區可以通過 void* 來訪問和操縱,程序結束後由系統自行釋放),在 C++ 裡面沒有這個區分了,他們共同佔用同一塊內存區。
2、常量存儲區:這是一塊比較特殊的存儲區,他們裡面存放的是常量,不允許修改
三、注意事項:常量字元串都存放在靜態存儲區,返回的是常量字元串的首地址.
『伍』 什麼是靜態存儲區和動態存儲區啊
1. 全局變數和靜態數據放在靜態存儲區,生命周期為從申請到程序退出。因此局部變數若定義為static,則存儲在靜態存儲區,否則存儲在函數的棧內,生命周期為本函數內。
2 動態存儲放自動變數和局部變數
『陸』 全局/靜態存儲區內存的容量是無限的嗎
全局變數存儲在靜態存儲區
局部變數存儲在棧里
new,malloc分配的內存存儲在堆里
你可以這么理解:
全局變數是程序是整個程序都需要用到的,單獨分出一塊存儲區保存,該存儲區存儲的數據不清空
局部變數是函數退出時自動清空的,所以放在棧里做臨時存儲
new,malloc分配的內存需要自己手動申請自己手動釋放
『柒』 C++運行時內存分為幾個區啊
在C++中,內存分成5個區,他們分別是堆、棧、自由存儲區、全局/靜態存儲區和常量存儲區。
1.棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的存儲區。裡面的變數通常是局部變數、函數參數等。
2.堆,就是那些由new分配的內存塊,他們的釋放編譯器不去管,由用戶的應用程序去控制,一般一個new就要對應一個delete。如果程序員沒有釋放掉,那麼在程序結束後,操作系統會自動回收。
3.自由存儲區,就是那些由malloc等分配的內存塊,它和堆是十分相似的,不過它是用free來結束自己的生命的。
4.全局/靜態存儲區,全局變數和靜態變數被分配到同一塊內存中,在以前的C語言中,全局變數又分為初始化的和未初始化的,在C++裡面沒有這個區分了,他們共同佔用同一塊內存區。
5.常量存儲區,這是一塊比較特殊的存儲區,他們裡面存放的是常量,不允許修改。
『捌』 C語言中全局變數的儲存類別是
C語言中全局變數的儲存類別是靜態存儲區。
由某對象或某個函數所創建的變數通常都是局部變數,只能被內部引用,而無法被其它對象或函數引用。
全局變數既可以是某對象函數創建,也可以是在本程序任何地方創建。全局變數是可以被本程序所有對象或函數引用。
(8)靜態存儲區和全局區擴展閱讀:
使用全局變數會佔用更多的內存(因為其生命期長),不過在計算機配置很高的今天,這個不應該算什麼問題,除非使用的是巨大對象的全局變數,能避免就一定要避免。
使用全局變數程序運行時速度更快一些(因為內存不需要再分配),同樣也快不了多少。對於局部變數的名字空間污染,這個在不使用太多變數時是可以避免的。
當全局變數與局部變數重名的時候,起作用的是局部變數,全局變數被屏蔽掉。還可以用extern在函數外對全局變數聲明,使全局變數的作用域從聲明處到文件的結束。
『玖』 在C語言中,全局變數的存儲類別是
全局變數的存儲類別是靜態存儲區。
變數分為局部與全局,局部變數又可稱之為內部變數。由某對象或某個函數所創建的變數通常都是局部變數,只能被內部引用,而無法被其它對象或函數引用。
全局變數既可以是某對象函數創建,也可以是在本程序任何地方創建。全局變數是可以被本程序所有對象或函數引用。
由下圖可以看出a、b、x、y 都是在函數外部定義的外部變數,都是全局變數。但x,y 定義在函數f1之後,而在f1內又無對x,y的說明,所以它們在f1內無效。 a,b定義在源程序最前面,因此在f1,f2及main內不加說明也可使用。
全局變數是使用相同的內存塊在整個類中存儲一個值全局變數extern與static,extern在其他源程序中也可以使用;static只能在本程序中使用。
(9)靜態存儲區和全局區擴展閱讀:
數據區可以分為靜態數據區(全局數據區)和動態數據區,後者又可分為堆區和棧區。之所以這樣劃分,是因為它們存放的數據和對應的管理方法不同。
靜態數據區、棧區和堆區的存儲空間分別遵循3種不同的規則:靜態存儲分配、棧式存儲分配和堆式存儲分配。後兩種分配方式皆稱為「動態存儲分配」,因為這兩種方式中存儲空間並不是在編譯的時候靜態分配好的,而是在運行時才進行的。
某些編程語言,如早期的FORTRAN語言及COBOL語言等,其存儲分配是完全靜態的,程序的數據對象與其存儲的綁定是在編譯期間進行的,稱為靜態語言。
而對於另一些語言,所有數據對象與其存儲的綁定只能發生在運行期間,此類語言稱為動態語言,如Lisp、ML、Perl等。多數語言(如C/C++、Java、Pascal等)採取的存儲分配策略是介於二者之間的。