sizeof(void*)的大小到底由何決定?

C中,sizeof(void*)的大小到底由什麼決定?


--------------------7.7--------------------------

編譯器目標平台的ABI

----------------------------7.8------------------

很多答案說取決於cpu 是不準確的: AMD64 cpu 是64位的,64位虛擬地址. 可以在上面運行64位 Windowst 、32位 Windowst、 DOS(16bit)。

取決於操作系統也是不準確的 :64位 Windows 可以支持 32位應用程序 和 16位 DOS 程序 。

取決於編譯器基本正確。但是一種編譯器可以為多個目標平台生成代碼。

------------------

得到的贊有點多,仔細檢查了一下,應該是目標平台的 軟體約定 , ABI (應用程序二進位介面,調用約定,類型表示和名稱修飾)屬於軟體約定 的一個子集。

WIKIPEDIA:

調用約定,類型表示和名稱修飾這三者的統稱,即是眾所周知的應用二進位介面(ABI)。

舉個例子 x64 軟體約定 里的 類型和存儲


由編譯器產生的目標平台的指令集決定的。譬如說x86就是4,x64就是8.


編譯器決定。有的人說是由CPU位寬決定。其實有一種編譯器稱之為交叉編譯器,就是一台機器給另外一台架構完全不同的機器編譯程序,比如Intel 64位的機器編譯的程序在ARM 32位的設備上運行。這裡的ARM 32位稱之為目標操作系統。

準確的說,與編譯器的目標平台有關。如果目標平台是32位的,那麼sizeof(void*)就是4,如果是64位的,那麼sizeof就是8,如果是16位的,就是2。

sizeof(void*)的含義就是獲取一個指針的大小。指針的本質就是內存地址,因此指針的大小和內存空間有關。32位的機器內存空間是2G(windows系統),因此指針的大小必須是log_2(2	imes 1024^3) = 31,湊個整數那就是32bit。因此本質上說,sizeof(void*)和編譯器目標平台的內存空間有關。


void* 可以看做一個integeral type.

sizeof(void*)是取決於這個整形量有多少個位元組而不是取決於其指向了啥決定的。

void*有多大看編譯器目標平台類型。x86通常4 bytes. x64通常8bytes.


根據不同的目標平台,編譯器在編譯的時候給它一個固定的值。

目標平台就是目標CPU。


編譯器


不同編譯器的數據類型佔位元組不同。

即sizeof()是編譯器決定的


推薦閱讀:

C++new運算符調用operator new 分配內存後, 構造函數調用及指針類型的轉換在哪裡完成?
有哪些較好的 C 語言程序源碼可供新手臨摹參考?
新手入門c語言應該下載那個軟體?
寫庫函數供他人用的原理是什麼?
C語言編譯中,如何查看定義了哪些宏?

TAG:C編程語言 | C | 指針 |