我的一些使用指針的代碼交易,並採取uintptr_t
作爲輸入,因爲它與指針的工作。
我現在必須對整數做同樣的事情,所以我想重用這段代碼。
是size_t
是否與uintptr_t
相同?我是否可以更改實現並使用相同的代碼來指針和整數,只需將uintptr_t
替換爲size_t
?
我的一些使用指針的代碼交易,並採取uintptr_t
作爲輸入,因爲它與指針的工作。
我現在必須對整數做同樣的事情,所以我想重用這段代碼。
是size_t
是否與uintptr_t
相同?我是否可以更改實現並使用相同的代碼來指針和整數,只需將uintptr_t
替換爲size_t
?
size_t
必須足夠大以包含最大的 可能對象的大小。 uintptr_t
必須大到足以包含 任何指針。鑑於此,或多或少保證 sizeof(uintptr_t) >= sizeof(size_t)
(因爲 中的所有字節必須是可尋址的最大可能的對象),但不是更多。 在具有線性尋址的機器上,它們可能是相同尺寸的 。另一方面,在分段體系結構上,由於uintptr_t
的uintptr_t
的值通常大於size_t
,因爲 對象必須位於單個段中,但指針必須能夠使用 來尋址所有內存。
它取決於實現(包括處理器,ABI,編譯器,標準庫)。您無法保證size_t
與uintptr_t
相同;但是這可能發生(在32位Linux x86或ARM上,都是32位無符號整數)。
size_t
的意圖是一個大小(特別是分配的內存塊),而uintptr_t
的意圖是與指針相同的位大小的無符號整數。
不同的編譯器有不同的結果。如果您希望它們具有相同的效果,您必須確保您的編譯器應該位於32位Linux x86或ARM上,那就是對的。