轉自:http://blog.sina.com.cn/s/blog_4fd9844201010n3v.html
應該說這是一個非常基礎的問題,教科書上說指針大小和機器字長相同,即32位機指針長度為4字節!但是對不對呢?為什么是這樣?
搜了一下相關資料。。。居然發現回答不統一,很多人也同樣是糊里糊塗。
下面對這個問題做一個系統的整理和分析:
首先,介紹幾個基本概念:(主要摘自百度百科)
字長:在同一時間中處理二進制數的位數叫字長。通常稱處理字長為8位數據的CPU叫8位CPU,32位CPU就是在同一時間內處理字長為32位的二進制數據。二進制的每一個0或1是組成二進制的最小單位,稱為一個比特(bit)。
一般說來,計算機在同一時間內處理的一組二進制數稱為一個計算機的“字”,而這組二進制數的位數就是“字長”。字長與計算機的功能和用途有很大的關系,是計算機的一個重要技術指標。字長直接反映了一台計算機的計算精度,為適應不同的要求及協調運算精度和硬件造價間的關系,大多數計算機均支持變字長運算,即機內可實現半字長、全字長(或單字長)和雙倍字長運算。在其他指標相同時,字長越大計算機的處理數據的速度就越快。早期的微機字長一般是8位和16 位,386以及更高的處理器大多是32位。目前市面上的計算機的處理器大部分已達到64位。
字長由微處理器(CPU)對外數據通路的數據總線條數決定。
最小可尋址單位:內存的最小可尋址單位通常都是字節。也就是說一個指針地址值可對應內存中一個字節的空間。
尋址空間:尋址空間一般指的是CPU對於內存尋址的能力。CPU最大能查找多大范圍的地址叫做尋址能力,CPU的尋址能力以字節為單位 (字節是最小可尋址單位),如32位尋址的CPU可以尋址2的32次方大小的地址也就是4G,這也是為什么32位尋址的CPU最大能搭配4G內存的原因,再多的話CPU就找不到了。
這里CPU的尋址位數是由地址總線的位數決定,32位CPU的尋址位數不一定是32位,因為32位CPU中32的意義為字長。
有關尋址范圍計算解釋,對於32位尋址的CPU,其地址值為32位的二進制數,所以可以表示的最大地址為2的32次方(即4G,最大內存空間為4GB,這里G表示數量、GB表示容量)。同時我們不難看出,一個指針的值就是一個32位的二進制數,32位對應4字節(Byte)。所以,指針的大小實際上是由CPU的尋址位數決定,而不是字長。
再來分析一下如下的情況:
32位處理器上32位操作系統的32位編譯器,指針大小4字節。
32位處理器上32位操作系統的16位編譯器,指針大小2字節。
32位處理器上16位操作系統的16位編譯器,指針大小2字節。
16位處理器上16位操作系統的16位編譯器,指針大小2字節。
這從結果看起來指針的大小和編譯器有關??
實際不是這樣的,有這樣的結果是因為以上幾種情況,處理器當前運行模式的尋址位數是不一樣的,如下:
Intel 32位處理器32位運行模式,邏輯尋址位數32,指針也就是32位,即4個字節
Intel 32位處理器16位虛擬機運行模式,邏輯尋址位數16,指針也就是16位,即2個字節
編譯器的作用是根據目標硬件(即CPU)的特性將源程序編譯為可在該硬件上運行的目標文件。如果一個編譯器支持某32位的CPU,那么它就可以將源程序編譯為可以在該CPU上運行的目標文件。該源程序中指針大小也會被編譯器根據該CPU的尋址位數(如32位)編譯選擇為4字節。
綜上可得:指針大小是由當前CPU運行模式的尋址位數決定!
