內存編址、尋址、內存對齊


學習筆記

1、內存編址方法

    內存在邏輯上是一個個格子,格子占有空間,可以用來存儲數據,每個格子有編號,編號就是內存的地址,地址和格子空間是一一對應且永久綁定的。程序運行時,CPU只關心地址,不關心這個地址所代表的空間在哪里,怎么分布這些實體問題。有地址就一定能夠找到對應的內存單元(內存單元:包括內存地址和空間)。地址是固定的,空間中存儲的東西是變動的,這和數組做左右值相關?

  關鍵:內存編址以 字節 為單位。比如給定一個內存地址7,其對應的空間大小就是固定的8bit,是定死的。一定要記住,以后學習指針的時候很重要。就好比賓館一樣,房間號(地址)不同每個房間都是標准的大床房(所占單位空間都一樣),沒有雙人間,都是標標准的大床房,面積都一樣,至於里面住什么人,看存的是啥。

 

2、內存和數據類型的關系

  c語言的數據類型有:char、short、int、long、float、double

  int(整型,整數類型,整體現在它和CPU的數據位寬是一樣的,如32位CPU,int就是32位,4byte)

  二者關系:數據類型是用來定義變量的,而這些變量需要存儲、運算、在內存中。所以數據類型必須和內存匹配,才能獲得最好性能 ,否則可能不工作或者效率低下。
  在32位系統中定義變量最好用int,因為這樣效率高,32位的系統本身配合內存也是32位,這樣的配置天生適合定義32位int變量(軟硬結合理解),效率高,當然其他的類型也能定義,但是訪問效率不高,比如定義8位的char,比32位的效率低。

  在很多32位環境下,定義bool變量,實際只需要一個bit位,但我們定義時,都是用int來實現bool。例如:我們定義一個 bool b1; 時,編譯器實際幫我們分配了32 位的內存來幫我們存儲這個變量,雖然浪費了31位,但是效率高。 現在硬件便宜,偏向效率。其實,這要具體情況具體分析。

 

3、內存對齊

  例如int:

  圖1這種是對齊訪問,類似圖2/3這種是非對齊訪問,邏輯雖然相同,都是int,32bit,但是對存的對齊訪問 不是邏輯問題,是硬件問題。

  硬件角度講:32bit的內存它 0 1 2 3 四個單元本身邏輯上就有相關性,這四個字節合起來當做一個int,硬件上就是合適的,效率就高,why?比如4人去出差,大家肯定希望在同一樓方便,如果隔了一層樓之類的,那肯定就是不方便了,雖然編號相連,但實際可能不相連,0 1 2 3 天生硬件就是連接的,而1 2 3 4就可能就不是相連的,效率就可能不高,但是一般硬件都是提供非對齊訪問的,但實際效率不高,現在一般內存訪問,有內存,有錢,不差那一點。

 

4、從內存編址看數組的意義

  數組就是拿一段內存空間出來。完全可以和內存邏輯圖類比理解,

int 類型數組 a。 首元素是a[0],包含4個元素 1 22 3 1,首地址是0,就是首元素那一串的第一個元素的地址0.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM