修行之路開始——對內存的理解

首先:需要思考下面這句話:

int  a = 10;

這簡單的一句話都包含了什麼?

1.變量名   

實際上就是這個意思,編譯器在編譯的時候把他放到了符號表(下面又說符號表)裏,然後在需要操作它的時候,會去符號表中找到一個叫a的地址,可以理解爲是字典類型的,一個鍵對應一個Value,這個鍵就是變量名,值就是變量的地址。然後再去訪問對應地址中的東西。指針變量也一樣,只是多一步尋址。

2.信息將要存儲在哪裏

就是地址啦

3.要存儲何種類型的值

也就是在內存中佔幾個字節

4.要存儲什麼值

也就是說佔的那幾個字節怎麼表示出這個值來

需要知道的知識:

8Bit=1byte。

32位操作系統尋址範圍:2^32 = 4294967296 Byte = 4194304 KB = 4096 MB = 4GB

64位操作系統尋址範圍:2^64=18446744073709551616 Byte=18014398509481984 KB=17592186044416 MB=17179869184 GB

尋址空間,每個CPU都有自己對內存尋址能力,通俗地說,就是能最多用到多少內存的一個問題。數據在存儲器(RAM)中存放是有規律的 ,CPU在運算的時候需要把數據提取出來就需要知道數據在那裏 ,這時候就需要挨家挨戶的找,這就叫做尋址,但如果地址太多超出了CPU的能力範圍,CPU就無法找到數據了。 CPU最大能查找多大範圍的地址叫做尋址能力 ,CPU的尋址能力以字節爲單位。 通常人們認爲,內存容量越大,處理數據的能力也就越強,但內存容量不可能無限的大,它要受到系統結構、硬件設計、製造成本等多方面因素的制約,一個最直接的因素取決於系統的地址總線的地址寄存器的寬度(位數)。 計算機的尋找範圍由總線寬度(處理器的地址總線的位數)決定的,也可以理解爲cpu寄存器位數,這二者一般是匹配的。

所以,我們可以把內存當作一個倉庫,把CPU當作一個庫房管理員。

倉庫裏最小的存儲單位是1Bit,即一個格子,而八個格子組成了一個架子,即1Byte。

不同的庫房管理員的體力能力不同,相同的對庫房的管理能力也就不同,有的能看管1000Byte的庫房,有的能看管100000Byte的庫房,你讓能看管100000Byte的庫房管理員去看官1000Byte的庫房大材小用,反過來就是資源浪費。

然後呢庫房的每個格子都有自己的一個十六進制編號,爲什麼用16進制?因爲太長了嘛。

然後那些數據也就存在這些地址裏了,一個int類型的變量,就佔四個格子,所以說CPU那邊有了這個int類型的變量的地址就直接能找到對應的格子,然後操作裏面的數據啦。即*p=你想要的任何數字。

另外還需要知道的計算機組成原理和編譯原理的一些知識。

 在編譯程序中,符號表是用來存放源程序中出現的有關名字的屬性信息,這些信息集中反映了名字的語義特徵屬性。符號表在編譯全過程的地位和作用非常重要,是進行上下文合法性檢查和語義處理及代碼生成的依據。符號表總體結構的設計和實現是與源語言的複雜性(包括詞法結構、語法結構的複雜性)有關,還與對於編譯系統在時間效率和空間效率方面的要求有關。爲此在本章中應對以下幾個重點、難點問題作認真的學習,並切實掌握其中的內容。

    也就是說你在寫程序的時候,定義的變量名是給咱們程序員自己看的,編譯器根據變量的修飾詞比如static或者什麼const啊或者什麼局部變量啊再或者什麼咱們自己的定義的類啊實例化出來的變量,依次放入內存劃分的那幾大區,所謂的變量名在內存中根本不存在,操作時轉換成地址數存放在寄存器中了。其實可以理解爲是符號表起到了連接作用,這個變量名其實就是一個標識符,用來指代一塊內存區域,即所謂的變量,使用變量使我們操作內存以區域,而在你的機器代碼中,是不會出現變量名的,變量名是給我們程序員操作內存來使用的。聽說在彙編年代,沒有變量名,那時候程序員操作內存,都是用地址來直接操作的,還要控制區域大小。

同理,指針變量這個東西也是一個變量名,就是說這樣嘛:int*p;這個東西你在64位操作系統裏用sizeof可以看到是8,也就是說,一個指針變量的大小是8個字節,這個指針變量裏面存着它所想讓CPU去尋找的真正地址,比如你用*p的時候嘛,這個過程就是說CPU通過符號表的地址找到了這個指針變量,然後再根據它這個裏面存的地址找到對應的那個地址,然後再根據這是個什麼類型的變量,比如是int類型的,就在找到的那個地址的基礎上數1,2,3,4個字節,這個東西,就是我們的int型變量。

而且我們知道C#或者C++引用類型的變量除了他實際指向的堆中那一坨,它本身也是個變量,就是個指針嘛,而且他和指針變量佔的內存也是一樣大的,也是8個字節。只不過這個引用類型的變量當實例化一個引用類型的變量,也就是new一個對象時侯,會返回一個對象實例的真實地址付給引用類型的變量,然後我們操作這個引用類型 變量加加減減的時候,就和操作指針的過程一樣了。

發佈了28 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章