❶ 如何儲存
計算機通過存儲系統來完成信息的保存和提取。
存儲系統是指計算機中由存放程序和數據的各種存儲設備、控制部件及管理信息調度的設備(硬體)和演算法(軟體)所組成的系統。計算機的主存儲器不能同時滿足存取速度快、存儲容量大和成本低的要求,在計算機中必須有速度由慢到快、容量由大到小的多級層次存儲器,以最優的控制調度演算法和合理的成本,構成具有性能可接受的存儲系統。
在計算機系統中存儲層次可分為高速緩沖存儲器、主存儲器、輔助存儲器三級。高速緩沖存儲器用來改善主存儲器與中央處理器的速度匹配問題。輔助存儲器用於擴大存儲空間。
信息存取過程中,存儲系統必須完成邏輯地址空間和物理地址空間之間的變換,並且合理地管理存儲系統資源。邏輯地址是指程序員編制的程序地址,由它構成邏輯地址空間。程序主存儲器中的實際地址稱為物理地址,由它構成物理地址空間。存儲映像基本上分為兩種情況:一種是邏輯地址空間小於物理地址空間,映像要求可以訪問所有的物理存儲器;另一種是邏輯地址空間大於物理地址空間,映像要確定每個邏輯地址實際所對應的物理地址。
最後補充下「靜態內存」和「動態內存「的區別:
1.靜態內存是指在程序開始運行時由編譯器分配的內存,它的分配是在程序開始編譯時完成的,不佔用CPU資源。程序中的各種變數,在編譯時系統已經為其分配了所需的內存空間,當該變數在作用域內使用完畢時,系統會自動釋放所佔用的內存空間。變數的分配與釋放,都無須程序員自行考慮。如:基本類型,數組。
2.動態內存:用戶無法確定空間大小,或者空間太大,棧上無法分配時,會採用動態內存分配。
3.二者區別:
a) 靜態內存分配在編譯時完成,不佔用CPU資源; 動態內存分配在運行時,分配與釋放都佔用CPU資源。
b) 靜態內存在棧(stack)上分配; 動態內存在堆(heap)上分配。
c) 動態內存分配需要指針和引用類型支持,靜態不需要。
d) 靜態內存分配是按計劃分配,由編譯器負責; 動態內存分配是按需分配,由程序員負責。
❷ 誰能給我講一下C語言中程序以及各類型數據存儲位置
我想很多人也是糊塗,以下文章寫得很好,故全文轉來,慢慢體會。
程序的內存分配(堆和棧區別)
一、預備知識 程序的內存分配
一個由c/C++編譯的程序佔用的內存分為以下幾個部分
1、棧區(stack) 由編譯器自動分配釋放 ,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧。
2、堆區(heap) 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表,呵呵。
3、全局區(靜態區)(static),全局變數和靜態變數的存儲是放在一塊的,初始化的全局變數和靜態變數在一塊區域, 未初始化的全局變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程序結束後有系統釋放
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"優化成一個地方。
}
二、堆和棧的理論知識
2.1申請方式
stack:
由系統自動分配。 例如,聲明在函數中一個局部變數 int b; 系統自動在棧中為b開辟空間
heap:
需要程序員自己申請,並指明大小,在c中malloc函數
如p1 = (char *)malloc(10);
在C++中用new運算符
如p2 = (char *)malloc(10);
但是注意p1、p2本身是在棧中的。
2.2
申請後系統的響應
棧:只要棧的剩餘空間大於所申請空間,系統將為程序提供內存,否則將報異常提示棧溢出。
堆:首先應該知道操作系統有一個記錄空閑內存地址的鏈表,當系統收到程序的申請時,
會遍歷該鏈表,尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閑結點鏈表中刪除,並將該結點的空間分配給程序,另外,對於大多數系統,會在這塊內存空間中的首地址處記錄本次分配的大小,這樣,代碼中的delete語句才能正確的釋放本內存空間。另外,由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閑鏈表中。
2.3申請大小的限制
棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由於系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。
2.4申請效率的比較:
棧由系統自動分配,速度較快。但程序員是無法控制的。
堆是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配內存,他不是在堆,也不是在棧是直接在進程的地址空間中保留一快內存,雖然用起來最不方便。但是速度快,也最靈活。
2.5堆和棧中的存儲內容
棧: 在函數調用時,第一個進棧的是主函數中後的下一條指令(函數調用語句的下一條可執行語句)的地址,然後是函數的各個參數,在大多數的C編譯器中,參數是由右往左入棧的,然後是函數中的局部變數。注意靜態變數是不入棧的。
當本次函數調用結束後,局部變數先出棧,然後是參數,最後棧頂指針指向最開始存的地址,也就是主函數中的下一條指令,程序由該點繼續運行。
堆:一般是在堆的頭部用一個位元組存放堆的大小。堆中的具體內容有程序員安排。
2.6存取效率的比較
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在運行時刻賦值的;
而bbbbbbbbbbb是在編譯時就確定的;
但是,在以後的存取中,在棧上的數組比指針所指向的字元串(例如堆)快。
比如:
#include
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
對應的匯編代碼
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一種在讀取時直接就把字元串中的元素讀到寄存器cl中,而第二種則要先把指針值讀到edx中,在根據edx讀取字元,顯然慢了。
2.7小結:
堆和棧的區別可以用如下的比喻來看出:
使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等准備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大
一般認為在c中分為這幾個存儲區
1棧 - 有編譯器自動分配釋放
2堆 - 一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收
3全局區(靜態區),全局變數和靜態變數的存儲是放在一塊的,初始化的全局變數和靜態變數在一塊區域,未初始化的全局變數和未初始化的靜態變數在相鄰的另一塊區域。- 程序結束釋放
4另外還有一個專門放常量的地方。 - 程序結束釋放
在函數體中定義的變數通常是在棧上,用malloc, calloc, realloc等分配內存的函數分配得到的就是在堆上。在所有函數體外定義的是全局量,加了static修飾符後不管在哪裡都存放在全局區(靜態區),在所有函數體外定義的static變數表示在該文件中有效,不能extern到別的文件用,在函數體內定義的static表示只在該函數體內有效。另外,函數中的"adgfdf"這樣的字元串存放在常量區。比如:
代碼:
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"優化成一塊。
}
還有就是函數調用時會在棧上有一系列的保留現場及傳遞參數的操作。棧的空間大小有限定,vc的預設是2M。棧不夠用的情況一般是程序中分配了大量數組和遞歸函數層次太深。有一點必須知道,當一個函數調用完返回後它會釋放該函數中所有的棧空間。棧是由編譯器自動管理的,不用你操心。
堆是動態分配內存的,並且你可以分配使用很大的內存。但是用不好會產生內存泄漏。並且頻繁地malloc和free會產生內存碎片(有點類似磁碟碎片),因為c分配動態內存時是尋找匹配的內存的。而用棧則不會產生碎片。
在棧上存取數據比通過指針在堆上存取數據快些。一般大家說的堆棧和棧是一樣的,就是棧(stack),而說堆時才是堆heap。棧是先入後出的,一般是由高地址向低地址生長。
❸ C++自由存儲區和堆棧
1. exe運行的時候,系統會創建一個進程,同時會分配一塊獨立的內存空間給該進程,這個內存空間在32位系統上是從0x00000000到0xFFFFFFFF, 4G的空間大小。2. CPU時間分配的單位是線程,所有的函數都是在一個線程裡面執行的,當線程創建時,系統會分配一段內存和寄存器給這個線程,線程就可以調用函數了。棧內存是在進程內存空間裡面。exe是一個文件的概念,只有當exe運行之後,系統創建的exe的進程實例之後,才會分配內存,所有棧內存是在exe的進程實例中的,在exe之內的說法不妥。3.自由存儲區和堆不是一個概念。一般而言,自由存儲區是指CRT(C運行時庫)通過malloc,free函數管理的內存。堆特指通過new,delete管理的內存。但是在部分編譯器的實現上這兩塊內存都是同一種管理方式。4. int* p = new int 如上述,在exe的進程空間棧內存空間裡面。5 棧產生的時機如2所講,是在一個線程創建的時候。 在C++程序中內存是分為5塊的,注意區分1.棧2.堆3.自由存儲區4.全局/靜態存儲區5.文字常量存儲區
❹ 堆棧在內存的什麼區
五大內存分區
在C++中,內存分成5個區,他們分別是堆、棧、自由存儲區、全局/靜態存儲區和常量存儲區。
棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的存儲區。裡面的變數通常是局部變數、函數參數等。
堆,就是那些由new分配的內存塊,他們的釋放編譯器不去管,由我們的應用程序去控制,一般一個new就要對應一個delete.如果程序員沒有釋放掉,那麼在程序結束後,操作系統會自動回收。
自由存儲區,就是那些由malloc等分配的內存塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。
全局/靜態存儲區,全局變數和靜態變數被分配到同一塊內存中,在以前的C語言中,全局變數又分為初始化的和未初始化的,在C++裡面沒有這個區分了,他們共同佔用同一塊內存區。
常量存儲區,這是一塊比較特殊的存儲區,他們裡面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改,而且方法很多)
首先,我們看一個例子:
void f() { int* p=new int[5]; }
這條短短的一句話就包含了堆與棧,看到new,我們首先就應該想到,我們分配了一塊堆內存,那麼指針p呢?他分配的是一塊棧內存,所以這句話的意思就是:在棧內存中存放了一個指向一塊堆內存的指針p.在程序會先確定在堆中分配內存的大小,然後調用operator new分配內存,然後返回這塊內存的首地址,放入棧中,
好了,我們回到我們的主題:堆和棧究竟有什麼區別?
主要的區別由以下幾點:
1、管理方式不同;
2、空間大小不同;
3、能否產生碎片不同;
4、生長方向不同;
5、分配方式不同;
6、分配效率不同;
管理方式:對於棧來講,是由編譯器自動管理,無需我們手工控制;對於堆來說,釋放工作由程序員控制,容易產生memory leak.
空間大小:一般來講在32位系統下,堆內存可以達到4G的空間,從這個角度來看堆內存幾乎是沒有什麼限制的。但是對於棧來講,一般都是有一定的空間大小的,例如,在VC6下面,默認的棧空間大小是1M(好像是,記不清楚了)。當然,我們可以修改:打開工程,依次操作菜單如下:Project->Setting->Link,在Category 中選中Output,然後在Reserve中設定堆棧的最大值和commit.注意:reserve最小值為4Byte;commit是保留在虛擬內存的頁文件裡面,它設置的較大會使棧開辟較大的值,可能增加內存的開銷和啟動時間。
碎片問題:對於堆來講,頻繁的new/delete勢必會造成內存空間的不連續,從而造成大量的碎片,使程序效率降低。對於棧來講,則不會存在這個問題,因為棧是先進後出的隊列,他們是如此的一一對應,以至於永遠都不可能有一個內存塊從棧中間彈出,在他彈出之前,在他上面的後進的棧內容已經被彈出,詳細的可以參考數據結構,這里我們就不再一一討論了。
生長方向:對於堆來講,生長方向是向上的,也就是向著內存地址增加的方向;對於棧來講,它的生長方向是向下的,是向著內存地址減小的方向增長。
分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如局部變數的分配。動態分配由alloca函數進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。
❺ C語言中結構體在內存中的存儲方式
結構體在內存中的存儲方式,和常規的C語言變數、常量存儲方式類似,唯的不同在於對齊。
只所以要進行數據對齊是因為編譯器對結構的存儲的特殊處理能提高CPU存儲變數的速度,一般來說,32位的CPU內存以4位元組對齊,64位的CPU的以8位元組的對齊。一般可以使用#pragma pack()來指出對齊的位元組數。比如下面的代碼,在debug會顯示結構體test的內存大小為28,如果生成release版則所佔內存大小為32 。
#include<stdio.h>
#ifdef_DEBUG
#pragmapack(4)
structtest
{
charx[13];//13
intd;//4
doublef;//8
}ss;
#else
#pragmapack(8)
structtest
{
charx[13];//13
intd;//4
doublef;//8
}ss;
#endif
intmain(void){
printf("%d ",sizeof(ss));
return0;
}
❻ 在微機系統中,對輸入輸出設備進行管理的基本系統是存放在( )中。
B:ROM中
說明:內存在電腦中起著舉足輕重的作用。內存一般採用半導體存儲單元,包括隨機存儲器(RAM),只讀存儲器(ROM),以及高速緩存(CACHE)。只不過因為RAM是其中最重要的存儲器。
通常所說的內存即指電腦系統中的RAM。RAM要求每時每刻都不斷地供電,否則數據會丟失。
如果在關閉電源以後RAM中的數據也不丟失就好了,這樣就可以在每一次開機時都保證電腦處於上一次關機的狀態,而不必每次都重新啟動電腦,重新打開應用程序了。但是RAM要求不斷的電源供應,那有沒有辦法解決這個問題呢?隨著技術的進步,人們想到了一個辦法,即給RAM供應少量的電源保持RAM的數據不丟失,這就是電腦的休眠功能,特別在Win2000里這個功能得到了很好的應用,休眠時電源處於連接狀態,但是耗費少量的電能。
按內存條的介面形式,常見內存條有兩種:單列直插內存條(SIMM),和雙列直插內存條(DIMM)。SIMM內存條分為30線,72線兩種。DIMM內存條與SIMM內存條相比引腳增加到168線。DIMM可單條使用,不同容量可混合使用,SIMM必須成對使用。
按內存的工作方式,內存又有FPA EDO DRAM和SDRAM(同步動態RAM)等形式。
FPA(FAST PAGE MODE)RAM 快速頁面模式隨機存取存儲器:這是較早的電腦系統普通使用的內存,它每個三個時鍾脈沖周期傳送一次數據。
EDO(EXTENDED DATA OUT)RAM 擴展數據輸出隨機存取存儲器:EDO內存取消了主板與內存兩個存儲周期之間的時間間隔,他每個兩個時鍾脈沖周期輸出一次數據,大大地縮短了存取時間,是存儲速度提高30%。EDO一般是72腳,EDO內存已經被SDRAM所取代。
S(SYSNECRONOUS)DRAM 同步動態隨機存取存儲器:SDRAM為168腳,這是目前PENTIUM及以上機型使用的內存。SDRAM將CPU與RAM通過一個相同的時鍾鎖在一起,使CPU和RAM能夠共享一個時鍾周期,以相同的速度同步工作,每一個時鍾脈沖的上升沿便開始傳遞數據,速度比EDO內存提高50%。
DDR(DOUBLE DATA RAGE)RAM :SDRAM的更新換代產品,他允許在時鍾脈沖的上升沿和下降沿傳輸數據,這樣不需要提高時鍾的頻率就能加倍提高SDRAM的速度。
RDRAM(RAMBUS DRAM) 存儲器匯流排式動態隨機存取存儲器;RDRAM是RAMBUS公司開發的具有系統帶寬,晶元到晶元介面設計的新型DRAM,他能在很高的頻率范圍內通過一個簡單的匯流排傳輸數據。他同時使用低電壓信號,在高速同步時鍾脈沖的兩邊沿傳輸數據。INTEL將在其820晶元組產品中加入對RDRAM的支持。
內存的參數主要有兩個:存儲容量和存取時間。存儲容量越大,電腦能記憶的信息越多。存取時間則以納秒(NS)為單位來計算。一納秒等於10^9秒。數字越小,表明內存的存取速度越快。
硬碟與內存的區別是很大的,這里只談最主要的三點:一、內存是計算機的工作場所,硬碟用來存放暫時不用的信息。二、內存是半導體材料製作,硬碟是磁性材料製作。三、內存中的信息會隨掉電而丟失,硬碟中的信息可以長久保存。
內存與硬碟的聯系也非常密切:這里只提一點:硬碟上的信息永遠是暫時不用的,要用嗎?請裝入內存!CPU與硬碟不發生直接的數據交換,CPU只是通過控制信號指揮硬碟工作,硬碟上的信息只有在裝入內存後才能被處理。
內存就是存儲程序以及數據的地方,比如當我們在使用WPS處理文稿時,當你在鍵盤上敲入字元時,它就被存入內存中,當你選擇存檔時,內存中的數據才會被存入硬(磁)盤。在進一步理解它之前,還應認識一下它的物理概念。
●只讀存儲器(ROM)
ROM表示只讀存儲器(Read Only Memory),在製造ROM的時候,信息(數據或程序)就被存入並永久保存。這些信息只能讀出,一般不能寫入,即使機器掉電,這些數據也不會丟失。ROM一般用於存放計算機的基本程序和數據,如BIOS ROM。其物理外形一般是雙列直插式(DIP)的集成塊。
●隨機存儲器(RAM)
隨機存儲器(Random Access Memory)表示既可以從中讀取數據,也可以寫入數據。當機器電源關閉時,存於其中的數據就會丟失。我們通常購買或升級的內存條就是用作電腦的內存,內存條(SIMM)就是將RAM集成塊集中在一起的一小塊電路板,它插在計算機中的內存插槽上,以減少RAM集成塊佔用的空間。目前市場上常見的內存條有4M/條、8M/條、16M/條等。
●高速緩沖存儲器(Cache)
Cache也是我們經常遇到的概念,它位於CPU與內存之間,是一個讀寫速度比內存更快的存儲器。當CPU向內存中寫入或讀出數據時,這個數據也被存儲進高速緩沖存儲器中。當CPU再次需要這些數據時,CPU就從高速緩沖存儲器讀取數據,而不是訪問較慢的內存,當然,如需要的數據在Cache中沒有,CPU會再去讀取內存中的數據。
內存儲器的劃分可歸納如下:
●基本內存 占據0~640KB地址空間。
●保留內存 占據640KB~1024KB地址空間。分配給顯示緩沖存儲器、各適配卡上的ROM和系統ROM BIOS,剩餘空間可作上位內存UMB。UMB的物理存儲器取自物理擴展存儲器。此范圍的物理RAM可作為Shadow RAM使用。
●上位內存(UMB) 利用保留內存中未分配使用的地址空間建立,其物理存儲器由物理擴展存儲器取得。UMB由EMS管理,其大小可由EMS驅動程序設定。
●高端內存(HMA) 擴展內存中的第一個64KB區域(1024KB~1088KB)。由HIMEM.SYS建立和管理。
●XMS內存 符合XMS規范管理的擴展內存區。其驅動程序為HIMEM.SYS。
●EMS內存 符合EMS規范管理的擴充內存區。其驅動程序為EMM386.EXE等。
內存在計算機中所扮演的角色
在計算機業界,內存這個名詞被廣泛用來稱呼 RAM( 隨機存取內存 ) 計算機使用隨機存取內存來儲存執行作業所須的暫時指令以及數據以使計算機的 CPU( 中央處理器 ) 能夠更快速讀取儲存在內存的指令及數據。
舉例來說,當處理器載入一個應用程序 - 例如文字處理或頁面編輯程序 - 到內存使應用程序能以最快速及最高效率的方式執行。以實用價值而言,將程序載入內存能夠確保計算機能以更短的時間來執行作業而使工作能夠更迅速地完成。
內存與儲存的差別
大多數人常將內存 (Memory) 與儲存空間 (Storage) 兩個名字混為一談 , 尤其是在談到兩者的容量的時候 內存是指 (Memory) 計算機中所安裝的隨機存取內存的容量而儲存 (Storage) 是指計算機內硬碟的容量 為了避免混淆 , 我們將計算機比喻為一個有辦公桌與檔案櫃的辦公室。
想像一下這個辦公桌與檔案櫃的比喻。想像每次想要閱讀一份文件或數據夾都必須從檔案櫃中找尋的情形,這會大幅減低工作執行的速度 , 更別說會把人逼瘋了。如果有足夠的辦公桌空間 ( 如內存 ), 便能夠將所需要的檔攤開 , 並能立即一眼就能找出所需的信息。
另一個內存與儲存最重要的差別在於 : 儲存於硬碟中的信息在關機後能夠保持完整,但任何儲存在內存中的數據在計算機關機後便會全部流失。就像在辦公室的比喻中 , 任何在下班時間後被遺留在桌上的檔或檔案都會全部被丟棄一樣。
內存與效能表現 (Memory and Performance)
增加計算機系統中的內存能夠增加計算機的效能表現是眾所皆知的。如果內存沒有足夠的空間 , 計算機就必須建立一個虛擬內存檔案。在這個過程中 , 中央處理器在硬碟中保留一個空間來代替額外的隨機存取內存 這個稱為 " Swapping" 的程序減低系統的速度 一般的計算機從內存存取大約需要 200ns( 奈秒 ), 但從硬碟存取則需12,000,000ns 具體來說就等於花四個半月的時間來完成三分半中就能完成的工作 !
從計算機的體系結構來講,硬碟應當是計算機的「外存」。內存應當是計算機內部(在主板上)的一些存儲器,用來保存CPU運算的中間數據和計算結果。這些數據有時被保存在硬碟上。目前計算機所配的內存一般是16M、32M、64M、128M、256M 等。硬碟的大小有4.3G、6.4G、8G、10G、20G、30G 等。
硬碟是一種主要的電腦存儲媒介,由一個或者多個鋁制或者玻璃制的碟片組成。這些碟片外覆蓋有鐵磁性材料。絕大多數硬碟都是固定硬碟,被永久性地密封固定在硬碟驅動器中。不過,現在可移動硬碟越來越普及,種類也越來越多。
絕大多數台式電腦使用的硬碟要麼採用 IDE 介面,要麼採用 SCSI 介面。SCSI 介面硬碟的優勢在於,最多可以有七種不同的設備可以聯接在同一個控制器面板上。由於硬碟以每秒3000—10000轉的恆定高速度旋轉,因此,從硬碟上讀取數據只需要很短的時間。在筆記本電腦中,硬碟可以在空閑的時候停止旋轉,以便延長電池的使用時間。老式硬碟的存儲容量最小隻有 5MB,而且,使用的是直徑達12英寸的碟片。現在的硬碟,存儲容量高達數十 GB,台式電腦硬碟使用的碟片直徑一般為3.5英寸,筆記本電腦硬碟使用的碟片直徑一般為2.5英寸。新硬碟一般都在裝配工廠中經過低級格式化,目的在於把一些原始的扇區鑒別信息存儲在硬碟上。 硬碟英文全稱是(Hard Disk),直譯為「堅固的磁碟」,從外形看起來,硬碟很像一個四四方方的金屬盒子,大小有5.25,3.5,2.5和1.8英寸(後兩種常用於筆記本及部分袖珍精密儀器中)幾種,現在台式機中常用的是3.5英寸的碟片。硬碟是一個計算機系統的數據存儲中心,我們運行計算機時使用的程序和數據目前絕大部分都存儲在硬碟上。硬碟在各種各樣固定存儲設備中的地位是最重要的(其他的存儲裝置包括軟盤、CD-ROM、磁帶、可移動驅動器等等),它是計算機中不可或缺的存儲設備絕大多數台式電腦使用的硬碟要麼採用 IDE 介面,要麼採用 SCSI 介面。SCSI 介面硬碟的優勢在於,最多可以有七種不同的設備可以聯接在同一個控制器面板上。由於硬碟以每秒3000—10000轉的恆定高速度旋轉,因此,從硬碟上讀取數據只需要很短的時間。在筆記本電腦中,硬碟可以在空閑的時候停止旋轉,以便延長電池的使用時間。老式硬碟的存儲容量最小隻有 5MB,而且,使用的是直徑達12英寸的碟片。現在的硬碟,存儲容量高達數十 GB,台式電腦硬碟使用的碟片直徑一般為3.5英寸,筆記本電腦硬碟使用的碟片直徑一般為2.5英寸。新硬碟一般都在裝配工廠中經過低級格式化,目的在於把一些原始的扇區鑒別信息存儲在硬碟上。
RAM(Random Access Memory)的全名為隨機存取記憶體,它相當於PC機上的移動存儲,用來存儲和保存數據的。它在任何時候都可以讀寫,RAM通常是作為操作系統或其他正在運行程序的臨時存儲介質(可稱作系統內存)。
不過,當電源關閉時RAM不能保留數據,如果需要保存數據,就必須把它們寫入到一個長期的存儲器中(例如硬碟)。正因為如此,有時也將RAM稱作「可變存儲器」。RAM內存可以進一步分為靜態RAM(SRAM)和動態內存(DRAM)兩大類。DRAM由於具有較低的單位容量價格,所以被大量的採用作為系統的主記憶。
RAM和ROM相比,兩者的最大區別是RAM在斷電以後保存在上面的數據會自動消失,而ROM就不會,Rom即光碟機,硬碟是可讀寫的。
❼ 堆棧是一種什麼存儲器
堆棧不是是什麼具體的存儲器,都是是內存,只不過有不同的用處。就像一個櫃子,你可以分成一個大櫃門,另一些空間可以做成些抽屜。其實都是存儲,但是可以把功能更詳細的分開,各自有自己的適用場合。
內存堆棧和樓上說的數據結構堆棧概念上還是有很大區別的。
這里的堆和棧不僅僅是按照數據結構里的堆和棧來理解,更傾向於表示兩種不同作用的內存區域。
棧是有編譯器來管理的,具體的大小可能根據編譯器不同而異,編譯器也可以手動設置棧的大小,通常有1M和2M的,比如在你定義變數時,由編譯器將變數壓棧,作用域結束,編譯器控制變數出棧,程序員不能很直接的操作棧。
堆內存是向系統申請的內存,由程序員管理的,你new或者malloc時系統正常情況下回給你一塊堆內存空間,你愛什麼時候存數據都行,想存什麼就存什麼,想什麼時候釋放(delete,free)都可以。堆的大小沒有什麼具體數值,看機器的運行狀況,配置狀況而定。
❽ c編譯器將變數分配在 什麼存儲器
DEV C++TurboC2.0Visual studio 6.0Code::Blocks以上幾款編輯器都可以在64位系統中運用。按照步驟如下:以Code::Blocks為例1首先下載下載Codeblocks這個軟體,目前最新版本是13.12,2這個軟體是英文的,所以軟體是英文界面,建議讀者使用英文版,不要去使用漢化版本,畢竟C語言是外國人開發的,所以用英文的界面會比較適合以後的能力提供,這個界面直接點擊【I Agree】,進如下一步安裝3這個是選擇安裝模式的界面,一般你的電腦是一個賬戶的,不是多人使用的電腦,所以這里選擇Full就行了,就是給電腦所有用戶安裝4來到這個界面選擇安裝路徑,這里強烈建議修改下安裝路徑,不建議使用默認的路徑,默認的路徑中【Program Files】中有一個空格,以後安裝一個插件可能會出問題,所以建議自己建立一個文件作為該軟體的安裝路徑,比如這里是在D盤建立了一個Develop的文件夾,作為開發軟體的安裝路徑,然後安裝路徑就選擇了D:\Develop\CodeBlocks,這里可以根據自己實際情況定義。5安裝結束之後,彈出提示是否運行Code::Blocks,這里都可以選,選擇運行6Code::Blocks的啟動界面,這里是13.12版本,在上述經驗有說到7這個直接選擇Set as default就行了,因為此時你還沒有安裝其他的插件,所以其他的選項是灰色的,然後點擊OK8緊接著看到的就是軟體的這界面,這個界面就是Code::Blocks的界面
❾ 編譯原理
編譯原理是計算機專業的一門重要專業課,旨在介紹編譯程序構造的一般原理和基本方法。內容包括語言和文法、詞法分析、語法分析、語法制導翻譯、中間代碼生成、存儲管理、代碼優化和目標代碼生成。 編譯原理是計算機專業設置的一門重要的專業課程。編譯原理課程是計算機相關專業學生的必修課程和高等學校培養計算機專業人才的基礎及核心課程,同時也是計算機專業課程中最難及最挑戰學習能力的課程之一。編譯原理課程內容主要是原理性質,高度抽象[1]。
中文名
編譯原理[1]
外文名
Compilers: Principles, Techniques, and Tools[1]
領域
計算機專業的一門重要專業課[1]
快速
導航
編譯器
編譯原理課程
編譯技術的發展
編譯的基本流程
編譯過程概述
基本概念
編譯原理即是對高級程序語言進行翻譯的一門科學技術, 我們都知道計算機程序由程序語言編寫而成, 在早期計算機程序語言發展較為緩慢, 因為計算機存儲的數據和執行的程序都是由0、1代碼組合而成的, 那麼在早期程序員編寫計算機程序時必須十分了解計算機的底層指令代碼通過將這些微程序指令組合排列從而完成一個特定功能的程序, 這就對程序員的要求非常高了。人們一直在研究如何如何高效的開發計算機程序, 使編程的門檻降低。[2]
編譯器
C語言編譯器是一種現代化的設備, 其需要藉助計算機編譯程序, C語言編譯器的設計是一項專業性比較強的工作, 設計人員需要考慮計算機程序繁瑣的設計流程, 還要考慮計算機用戶的需求。計算機的種類在不斷增加, 所以, 在對C語言編譯器進行設計時, 一定要增加其適用性。C語言具有較強的處理能力, 其屬於結構化語言, 而且在計算機系統維護中應用比較多, C語言具有高效率的優點, 在其不同類型的計算機中應用比較多。[3]
C語言編譯器前端設計
編譯過程一般是在計算機系統中實現的, 是將源代碼轉化為計算機通用語言的過程。編譯器中包含入口點的地址、名稱以及機器代碼。編譯器是計算機程序中應用比較多的工具, 在對編譯器進行前端設計時, 一定要充分考慮影響因素, 還要對詞法、語法、語義進行分析。[3]
1 詞法分析[3]
詞法分析是編譯器前端設計的基礎階段, 在這一階段, 編譯器會根據設定的語法規則, 對源程序進行標記, 在標記的過程中, 每一處記號都代表著一類單詞, 在做記號的過程中, 主要有標識符、關鍵字、特殊符號等類型, 編譯器中包含詞法分析器、輸入源程序、輸出識別記號符, 利用這些功能可以將字型大小轉化為熟悉的單詞。[3]
2 語法分析[3]
語法分析是指利用設定的語法規則, 對記號中的結構進行標識, 這包括句子、短語等方式, 在標識的過程中, 可以形成特殊的結構語法樹。語法分析對編譯器功能的發揮有著重要影響, 在設計的過程中, 一定要保證標識的准確性。[3]
3 語義分析[3]
語義分析也需要藉助語法規則, 在對語法單元的靜態語義進行檢查時, 要保證語法規則設定的准確性。在對詞法或者語法進行轉化時, 一定要保證語法結構設置的合法性。在對語法、詞法進行檢查時, 語法結構設定不合理, 則會出現編譯錯誤的問題。前端設計對精確性要求比較好, 設計人員能夠要做好校對工作, 這會影響到編譯的准確性, 如果前端設計存在失誤, 則會影響C語言編譯的效果。[3]