這篇文章主要講的是内存的物理機制的原理是什麼?以及我們在開發中定義的變量是怎樣存儲的。認真看完才會覺得很簡單,如果隻是粗略的看,那就啥都學不到。
首先讓我們來看一下内存的物理機制。内存實際上是一種名為内存IC的電子元件。雖然内存IC包括DRAM、SRAM、ROM等多種形式,但從外部來看,其基本機制都是一樣的。内存IC中有電源、地址信号、數據信号、控制信号等用于輸入輸出的大量引腳(IC的引腳),通過為其指定地址(address),來進行數據的讀寫。
上圖是内存IC(在這裡假設它為RAM)的引腳配置示例。雖然這是一個虛拟的内存IC,但它的引腳和實際的内存IC是一樣的。
VCC和GND是電源,A0~A9是地址信号的引腳,D0~D7是數據信号的引腳,RD和WR是控制信号的引腳。将電源連接到VCC和GND後,就可以給其他引腳傳遞比如0或者1這樣的信号。大多數情況下, 5V的直流電壓表示1,0V表示0。
那麼,這個内存IC中能存儲多少數據呢?數據信号引腳有D0~D7共八個,表示一次可以輸入輸出8位(=1字節)的數據。此外,地址信号引腳有A0~A9共十個,表示可以指定0000000000~1111111111共1024個地址。而地址用來表示數據的存儲場所,因此我們可以得出這個内存IC中可以存儲1024個1字節的數據。因為1024=1KB,所以該内存IC的容量就是1KB。
現在大家使用的計算機至少有512M的内存。這就相當于512000個(512MB÷1KB=512K)1KB的内存IC 。當然,一台計算機中不太可能放入如此多的内存IC。
通常情況下,計算機使用的内存IC中會有更多的地址信号引腳,這樣就能在一個内存IC中存儲數十兆字節的數據。因此,隻用數個内存IC,就可以達到512MB的容量。
下面讓我們繼續來看剛才所說的1KB的内存IC。首先,我們假設要往該内存IC中寫入1字節的數據。為了實現該目的,可以給VCC接入 5V,給GND接入0V的電源,并使用A0~A9的地址信号來指定數據的存儲場所,然後再把數據的值輸入給D0~D7的數據信号,并把WR(write=寫入的簡寫)信号設定成1_。執行完這些操作,就可以在内存IC内部寫入數據了。
向内存IC中寫入和讀出數據的方法讀出數據時,隻需通過A0~A9的地址信号指定數據的存儲場所,然後再将RD(read=讀出的簡寫)信号設成1即可。執行完這些操作,指定地址中存儲的數據就會被輸出到D0~D7的數據信号引腳。另外,像WR和RD這樣可以讓IC運行的信号稱為控制信号。其中,當WR和RD同時為0時,寫入和讀出的操作都無法進行。
由此可見,内存IC的物理機制實質上是很簡單的。總體來講,内存IC内部有大量可以存儲8位數據的地方,通過地址指定這些場所,之後即可進行數據的讀寫。
2.變量是怎樣存儲的下面我們來看一個具體的示例。如下所示的代碼清單,這是一個往a、b、c這3個變量中寫入數據123的C語言程序。這3個變量表示的是内存的特定區域。通過使用變量,即便不指定物理地址,也可以在程序中對内存進行讀寫。這是因為,在程序運行時,Windows等操作系統會自動決定變量的物理地址。
char a = '123'
short b = 123
long c = 123
這3個變量的數據類型分别是,表示1字節長度的char,表示2字節長度的short,以及表示4字節長度的long。因此,雖然同樣是數據123,存儲時其所占用的内存大小是不一樣的。這裡,我們假定采用的是将數據低位存儲在内存低位地址的低字節序。
仔細思考一下就會發現,根據程序中所指定的變量的數據類型的不同,讀寫的物理内存大小也會随之發生變化,這其實是非常方便的。大家不妨想一想,假如程序中隻能逐個字節地對内存進行讀寫,那該多麼不便啊。在處理超過1個字節的數據時,還必須要編寫分割處理程序。此外,在不同的編程語言中,變量可以指定的數據類型的最大長度也不相同。C語言中,8字節(=64位)的double類型是最大的。
3.指針接下來,讓我們一起來看一下指針。指針是C語言的重要特征,但很多人都說它難以理解,甚至還有人因無法理解指針而對C語言的學習産生了很強的挫敗感。不過,對已經閱讀到現在的各位讀者來說,指針應該很容易理解。理解指針的關鍵點就是要弄清楚數據類型這個概念。
指針也是一種變量,它所表示的不是數據的值,而是存儲着數據的内存的地址。通過使用指針,就可以對任意指定地址的數據進行讀寫。雖然前面所提到的假想内存IC中僅有10位地址信号,但大家在Windows計算機上使用的程序通常都是32位(4字節)的内存地址。這種情況下,指針變量的長度也是32位。
請大家看一下代碼清單。這是定義了d、e、f這3個指針變量的C語言程序。和通常的變量定義有所不同,在定義指針時,我們通常會在變量名前加一個星号(*)。我們知道,d、e、f都是用來存儲32位(4字節)的地址的變量。然而,為什麼這裡又用來指定char (1字節)、short(2字節)、long(4字節)這些數據類型呢?大家是不是也感到很奇怪?實際上,這些數據類型表示的是從指針存儲的地址中一次能夠讀寫的數據字節數。
char *d
short *e
long *f
假設d、e、f的值都是100。在這種情況下,使用d時就能夠從編号100的地址中讀寫1個字節的數據,使用e時就是2個字節(100地址和101地址)的數據,使用f時就是4個字節(100地址~103地址)的數據。怎麼樣?指針是不是很簡單呢(如下圖所示)
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!