本文轉自http://blog.sina.com.cn/s/blog_4fd9844201010n3v.htmlhtml
應該說這是一個很是基礎的問題,教科書上說指針大小和機器字長相同,即32位機指針長度爲4字節!可是對不對呢?爲何是這樣?spa
搜了一下相關資料。。。竟然發現回答不統一,不少人也一樣是糊里糊塗。操作系統
下面對這個問題作一個系統的整理和分析:指針
首先,介紹幾個基本概念:(主要摘自百度百科)htm
字長:在同一時間中處理二進制數的位數叫字長。一般稱處理字長爲8位數據的CPU叫8位CPU,32位CPU就是在同一時間內處理字長爲32位的二進制數據。二進制的每個0或1是組成二進制的最小單位,稱爲一個比特(bit)。blog
通常說來,計算機在同一時間內處理的一組二進制數稱爲一個計算機的「字」,而這組二進制數的位數就是「字長」。字長與計算機的功能和用途有很大的關係,是計算機的一個重要技術指標。字長直接反映了一臺計算機的計算精度,爲適應不一樣的要求及協調運算精度和硬件造價間的關係,大多數計算機均支持變字長運算,即機內可實現半字長、全字長(或單字長)和雙倍字長運算。在其餘指標相同時,字長越大計算機的處理數據的速度就越快。早期的微機字長通常是8位和16 位,386以及更高的處理器大可能是32位。目前市面上的計算機的處理器大部分已達到64位。內存
字長由微處理器(CPU)對外數據通路的數據總線條數決定。編譯器
最小可尋址單位:內存的最小可尋址單位一般都是字節。也就是說一個指針地址值可對應內存中一個字節的空間。虛擬機
尋址空間:尋址空間通常指的是CPU對於內存尋址的能力。CPU最大能查找多大範圍的地址叫作尋址能力 ,CPU的尋址能力以字節爲單位(字節是最小可尋址單位),如32位尋址的CPU能夠尋址2的32次方大小的地址也就是4G,這也是爲何32位尋址的CPU最大能搭配4G內存的緣由,再多的話CPU就找不到了。it
這裏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運行模式的尋址位數決定!