內存存儲區
1、從操作系統原理的角度來看,只有一個存儲區就是虛擬內存。
2、根據功能可以分為 ,棧區 、堆區、靜態區, 棧區一般指的一個函數局部變數,在編譯原理中這叫做一個棧幀。 堆區一般是為了用戶自由分配的,一般C語言中用MALLOC函數分配,C++中用NEW運算符來分配,它是有操作系統的堆管理器來管理的,拿windows來說,在一個程序運行後,一般至少有兩個默認的堆,一個是new堆,一個進程 自己的堆, 靜態區,這個一般是全局變數或者static變數使用的區域,這個區域,如果你對PE結構熟悉,就會明白這實際上是pe 區段中的.data區段,當程序運行後變成進程,這個區段是直接內存文件映射過去的。
㈡ 內存屬於硬碟的一個存儲區域
內存屬於硬碟的一個存儲區域檔判是錯誤的。根據查詢相關公開信息顯示,該指悶題屬於計算機一級等級考試的選擇題,內存是計算機交換數據,硬碟是計算機的行逗改外存儲器。
㈢ C++程序運行時的內存空間如何分區
C++程序的內純格局通常分為4個區:
1.數據區(Data Area)
2.代碼區(Code Area)
3.棧區(Stack Area)
4.堆區(即自由存儲區)(Heap Area)
全局變數、靜態變數、常量存放在數據區,所有類成員函數和非成員函數代碼存放在代碼區,為運行函數而分配的局部變數、函數參數、返回數據、返回地址等存放在棧區,餘下的空間為堆區。
因為堆是有限的,它可能變得擁擠,如果堆中沒有足夠的自由空間以滿足內存的需要時,那麼此需要失敗,並且返回一個空指針。因此,必須在使用NEW生成的指針之前進行檢查,方法如下:
C++代碼
HeapClass *pa1 , *pa2;
pa1 = new HeapClass(4); // 分配空間
pa2 = new HeapClass (); // 分配空間
if(!pa1 || !pa2){ // 檢查空間
cout<<"out of Memory"<<endl;
return;
}
HeapClass *pa1 , *pa2;
pa1 = new HeapClass(4); // 分配空間
pa2 = new HeapClass (); // 分配空間
if(!pa1 || !pa2){ // 檢查空間
cout<<"out of Memory"<<endl;
return;
}
一般來說,堆空間相對其他內存空間比較空閑,隨要隨拿,給程序運行帶來了較大的自由度,但是管理堆區是一件十分復雜的工作,頻繁地分配(NEW)和釋放(DELETE)不同大小的堆空間將會產生堆內碎塊。使用堆空間往往由於:
.直到運行時才能知道需要多少對象空間;
.不知道對象的生存期到底有多長;
.直到運行時才知道一個對象需要多少內存空間;
㈣ C++運行時內存分為幾個區啊
在C++中,內存分成5個區,他們分別是堆、棧、自由存儲區、全局/靜態存儲區和常量存儲區。
1.棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的存儲區。裡面的變數通常是局部變數、函數參數等。
2.堆,就是那些由new分配的內存塊,他們的釋放編譯器不去管,由用戶的應用程序去控制,一般一個new就要對應一個delete。如果程序員沒有釋放掉,那麼在程序結束後,操作系統會自動回收。
3.自由存儲區,就是那些由malloc等分配的內存塊,它和堆是十分相似的,不過它是用free來結束自己的生命的。
4.全局/靜態存儲區,全局變數和靜態變數被分配到同一塊內存中,在以前的C語言中,全局變數又分為初始化的和未初始化的,在C++裡面沒有這個區分了,他們共同佔用同一塊內存區。
5.常量存儲區,這是一塊比較特殊的存儲區,他們裡面存放的是常量,不允許修改。
㈤ 簡單說一說內存泄漏、內存溢出、內存碎片。
在內存中供用戶使用的內存區有三個:
程序存儲區、
靜態存儲區、
動態存儲區。
程序的數據一般存放在靜態存儲區螞明和動態存儲區。
靜態存儲區是當程序開始的時候就分配好的一塊固定的內存區。
動態存儲區一般是在程序運行過程中根據需要動態去分配和釋放的內存區域。這塊內存區域需要開發人員在使用完畢之後進行釋放,如果沒有釋放動態分配的內存區域就會造成內存泄漏。相應的這塊區域也不能夠被使用。
舉個例子:有一個可以裝50ml水的空杯子,但是你非得向這個被子裡面倒了100ml水,那麼這個時候多餘的水肯定會流出來,這就是水溢出了。那麼放到內存來講,就是內存溢出。
內存碎片分為外部碎片和內部碎片
外部碎片指的是還沒有被分配出去(不屬於任何進程)悶手告,但由於太小了無法分配給申請內存空間的新進程的內存空閑區域。
外部碎片是出於任何已分配區域或頁面外部的空閑存儲塊。這些存儲塊的總和可以滿足當前申請的長度要求,但是由於它們的地址不連續或其他原因,使得系統薯叢無法滿足當前申請。
內部碎片就是已經被分配出去(能明確指出屬於哪個進程)卻不能被利用的
空間;
內部碎片是處於內部或頁面內部的存儲塊。佔有這些區域或頁面的進程並不使用這個存儲塊。而在進程佔有這塊存儲塊時,系統無法利用它。直到進程釋放它,或進程結束時,系統才有可能利用這個存儲塊。
㈥ 內存與外存的本質區別在哪裡
內存和外存的本質區別是,一個是內部運行提供緩存和處理碰升的功能,也可以理解為協同處理的通道;而外存主要是針對儲存文件、圖片、視頻、文字等信息的載體,也可以理解為儲存圓彎空間。
內存是計算機中重要的部件之一,它是與CPU進行溝通的橋梁。計算機中所有程序的運行都是在內存中進行的,因此內存的性能對笑腔老計算機的影響非常大。內存(Memory)也被稱為內存儲器,其作用是用於暫時存放CPU中的運算數據,以及與硬碟等外部存儲器交換的數據。只要計算機在運行中,CPU就會把需要運算的數據調到內存中進行運算,當運算完成後CPU再將結果傳送出來,內存的運行也決定了計算機的穩定運行。 內存是由內存晶元、電路板、金手指等部分組成的。
㈦ 內存作為硬體實體存儲區分行,列嗎
分的。
在內存的定址中,鎖畝沒定數據地址需要提供行地址和列地址,行地址的選通由RAS控制罩耐慶,列地址的選通由CAS決定。
行地址物握:用於選擇指定行。列地址:用於選擇指定行中的指定字。㈧ 內存的存儲區域有哪幾種
分為2種一種是RAM 另一種是ROM
存儲器分為隨機存儲器(RAM)和只讀存儲器(ROM)兩種。其中ROM通常用來固化存儲一些生產廠家寫入的程序或數據,用於啟動電腦和控制電腦的工作方式。而RAM則用來存取各種動態的輸入輸出數據、中間計算結果以及與外部存儲器交換的數據和暫存數據。設備斷電後,RAM中存儲的數據就會丟失。㈨ c#程序運行時內存分為哪幾個區
一、內存基本構成
可編程內存在基本上分為這樣的幾大部分:靜態存儲區、堆區和棧區。他們的功能不同,對他們使用方式也就不同。
靜態存儲區:內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。它主要存放靜態數據、全局數據和常量。
棧區:在執行函數時,函數內局部變數的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置於處理器的指令集中,效率很高,但是分配的內存容量有限。
堆區:亦稱動態內存分配。程序在運行的時候用malloc或new申請任意大小的內存,程序員自己負責在適當的時候用free或delete釋放內存。動態內存的生存期可以由我們決定,如果我們不釋放內存,程序將在最後才釋放掉動態內存。 但是,良好的編程習慣是:如果某動態內存不再使用,需要將其釋放掉,否則,我們認為發生了內存泄漏現象。
二、三者之間的區別
我們通過代碼段來看看對這樣的三部分內存需要怎樣的操作和不同,以及應該注意怎樣的地方。
例一:靜態存儲區與棧區
char* p = 「Hello World1」;
char a[] = 「Hello World2」;
p[2] = 『A』;
a[2] = 『A』;
char* p1 = 「Hello World1;」
這個程序是有錯誤的,錯誤發生在p[2] = 『A』這行代碼處,為什麼呢,是變數p和變數數組a都存在於棧區的(任何臨時變數都是處於棧區的,包括在main()函數中定義的變數)。但是,數據「Hello World1」和數據「Hello World2」是存儲於不同的區域的。
因為數據「Hello World2」存在於數組中,所以,此數據存儲於棧區,對它修改是沒有任何問題的。因為指針變數p僅僅能夠存儲某個存儲空間的地址,數據「Hello World1」為字元串常量,所以存儲在靜態存儲區。雖然通過p[2]可以訪問到靜態存儲區中的第三個數據單元,即字元『l』所在的存儲的單元。但是因為數據「Hello World1」為字元串常量,不可以改變,所以在程序運行時,會報告內存錯誤。並且,如果此時對p和p1輸出的時候會發現p和p1裡面保存的地址是完全相同的。換句話說,在數據區只保留一份相同的數據(見圖1-1)。
例二:棧區與堆區
char* f1()
{
char* p = NULL;
char a;
p = &a;
return p;
}
char* f2()
{
char* p = NULL:
p =(char*) new char[4];
return p;
}
這兩個函數都是將某個存儲空間的地址返回,二者有何區別呢?f1()函數雖然返回的是一個存儲空間,但是此空間為臨時空間。也就是說,此空間只有短暫的生命周期,它的生命周期在函數f1()調用結束時,也就失去了它的生命價值,即:此空間被釋放掉。所以,當調用f1()函數時,如果程序中有下面的語句:
char* p ;
p = f1();
*p = 『a』;
此時,編譯並不會報告錯誤,但是在程序運行時,會發生異常錯誤。因為,你對不應該操作的內存(即,已經釋放掉的存儲空間)進行了操作。但是,相比之下,f2()函數不會有任何問題。因為,new這個命令是在堆中申請存儲空間,一旦申請成功,除非你將其delete或者程序終結,這塊內存將一直存在。也可以這樣理解,堆內存是共享單元,能夠被多個函數共同訪問。如果你需要有多個數據返回卻苦無辦法,堆內存將是一個很好的選擇。但是一定要避免下面的事情發生:
void f()
{
…
char * p;
p = (char*)new char[100];
…
}
這個程序做了一件很無意義並且會帶來很大危害的事情。因為,雖然申請了堆內存,p保存了堆內存的首地址。但是,此變數是臨時變數,當函數調用結束時p變數消失。也就是說,再也沒有變數存儲這塊堆內存的首地址,我們將永遠無法再使用那塊堆內存了。但是,這塊堆內存卻一直標識被你所使用(因為沒有到程序結束,你也沒有將其delete,所以這塊堆內存一直被標識擁有者是當前您的程序),進而其他進程或程序無法使用。我們將這種不道德的「流氓行為」(我們不用,卻也不讓別人使用)稱為內存泄漏。這是我們C++程序員的大忌!!請大家一定要避免這件事情的發生。
總之,對於堆區、棧區和靜態存儲區它們之間最大的不同在於,棧的生命周期很短暫。但是堆區和靜態存儲區的生命周期相當於與程序的生命同時存在(如果您不在程序運行中間將堆內存delete的話),我們將這種變數或數據成為全局變數或數據。但是,對於堆區的內存空間使用更加靈活,因為它允許你在不需要它的時候,隨時將它釋放掉,而靜態存儲區將一直存在於程序的整個生命周期中。
我們此專題僅僅是簡要的分析了內存基本構成以及使用它們時需要注意的問題。對內存的分析和討論將一直貫穿於我們以後所有的專題,這也就是為什麼把它作為第一講的原因。㈩ 內存作為硬體實體存儲區分行、列嗎
區分。內存分為單行列和雙行列,單行列是8顆粒,雙行列是16顆粒。單行列是指兩面全部顆粒組成64位內存條,雙行列指兩面中每面的內存顆粒組成64位,只是讀寫方式不一樣的。