1 3記憶體編址和定址 記憶體對齊

2021-10-10 01:14:44 字數 1452 閱讀 8939

記憶體邏輯上就是乙個乙個的格仔,這些格仔可以用來裝東西(裡面裝的東西就是記憶體中儲存的數),每個格仔有乙個編號,這個編號就是記憶體位址,這個記憶體位址(乙個數字)和這個格仔的空間(實質是乙個空間)是一一對應且永久繫結的。這就是記憶體的編址方法。

在程式執行時,計算機中cpu實際只認識記憶體位址,而不關心這個位址所代表的空間在**,怎麼分布這些實體問題。因為硬體設計保證了按照這個位址就一定能找到這個格仔,所以說記憶體單元的2個概念:位址和空間是記憶體單元的兩個方面。

我隨便給乙個數字(譬如說7),然後說這個數字是乙個記憶體位址,然後問你這個記憶體位址對應的空間多大?這個大小是固定的,就是乙個位元組(8bit)。

如果把記憶體比喻為一棟大樓,那麼這個樓裡面的乙個乙個房間就是乙個乙個記憶體格仔,這個格仔的大小是固定的8bit,就好像這個大樓裡面所有的房間戶型是一樣的。

乙個位址天生的對應空間的長度就是乙個位元組而已;

c語言中的基本資料型別有:char, short, int, long, float, double

int 整型(整數型別,這個整就體現在它和cpu本身的資料位寬是一樣的)譬如32位的cpu,整型就是32位,int就是32位。

資料型別和記憶體的關係就在於:

資料型別是用來定義變數的,而這些變數需要儲存、運算在記憶體中,所以資料型別必須和記憶體相匹配才能獲得最好的效能,否則可能不工作或者效率低下。

在32位系統中定義變數最好用int,因為這樣效率高。原因就在於32位的系統本身配合記憶體的也是32位,這樣的硬體配置天生適合定義32位的int型別變數,效率最高。也能定義8位的char型別變數或者16位的short型別變數,但是實際上訪問效率不高。

在很多32位環境下,我們實際定義bool型別變數(實際只需要1個bit就夠了)都是用int來實現bool的。也就是說我們定義乙個bool b1時,編譯器實際幫我們分配了32位的記憶體來儲存這個bool變數b1,編譯器這麼做實際上浪費了31位的記憶體,但是好處是效率高。

問題:實際程式設計時要以省記憶體為大還是要以執行效率為重?答案是不定的,看具體情況。現在的機器都是高配,不在乎省一點記憶體,而效率和使用者體驗成了關鍵。所以現在程式大部分都是以效率為重。

我們在c中int a;定義乙個int型別變數,在記憶體中就必須分配4個位元組來儲存這個a,有這麼2種不同記憶體分配思路和策略:

第一種:0 1 2 3 對齊訪問

第二種:1 2 3 4或者2 3 4 5或者3 4 5 6 非對齊訪問

記憶體的對齊訪問不是邏輯的問題,是硬體的問題。從硬體角度來說,32位的記憶體它0,1,2,3四個單元本身邏輯上就有相關性,這4個位元組組合起來當作乙個int,硬體上就是合適的,效率就高。

對齊訪問很配合硬體,所以效率很高,非對齊訪問因為和硬體本身不搭配,所以效率不高。(因為相容性的問題,一般硬體也都提供非對齊訪問)

陣列其實就是從記憶體中擷取了一部分而已,陣列名a代表陣列中首元素的首位址,那麼何謂首位址呢?所謂首位址就是陣列中的第乙個元素共32位,一共有4個位址,因為int型別包含四個位元組,每個位元組有乙個位址,那麼a就代表第乙個位元組的位址。

記憶體定址 編址

一般常見對記憶體的理解是將他看成是乙個陣列.陣列元素肯定有個大小,陣列的元素還需要有個序號.這個陣列的序號就是記憶體的位址,而陣列元素的大小是記憶體定址的方式,最為常見的是按位元組定址,即每個陣列元素 單元 可以儲存乙個位元組大小的內容.我們將記憶體位址0x.de20起的記憶體按照位元組大小劃分,可...

記憶體 編址 指標

2 10 1k 2 20 1m 2 30 1g 2 32 4g 別忘了,上述單位都是byte位元組,記憶體是以位元組為單位編址的。可以將32位機器的記憶體 應該是虛擬記憶體 想象成乙個陣列,含有2 32個元素。記憶體位址就是這個陣列的編號,從1 0x00000001 到 2 32 0xfffffff...

怎麼理解記憶體的位元組編址

記憶體也就是常說的記憶體條,也就是dram晶元如下圖 計算機的記憶體是按位元組來進行編址的這句話理解為 記憶體是按位元組編址,每個位址的儲存單元可以存放8bit的資料。我們也知道cpu通過記憶體位址獲取一條指令和資料,而他們存在儲存單元中。現在就有乙個問題。我們的資料和指令不可能剛好是8bit,如果...