可能重复:
size_t 与 intptr_t
我的一些代码处理指针并uintptr_t
作为输入,因为它必须使用指针。
我现在必须对整数做同样的事情,所以我想重用该代码。
是size_t
一样的uintptr_t
吗?uintptr_t
我可以通过替换来更改实现并对指针和整数使用相同的代码size_t
吗?
可能重复:
size_t 与 intptr_t
我的一些代码处理指针并uintptr_t
作为输入,因为它必须使用指针。
我现在必须对整数做同样的事情,所以我想重用该代码。
是size_t
一样的uintptr_t
吗?uintptr_t
我可以通过替换来更改实现并对指针和整数使用相同的代码size_t
吗?
size_t
必须足够大以包含最大可能对象的大小。 uintptr_t
必须足够大以包含
任何指针。鉴于此,或多或少可以保证
sizeof(uintptr_t) >= sizeof(size_t)
(因为最大可能对象中的所有字节都必须是可寻址的),但不能保证更多。在具有线性寻址的机器上,它们的大小可能相同。另一方面,在分段架构中,通常uintptr_t
大于size_t
,因为对象必须位于单个段中,但指针必须能够寻址所有内存。
它取决于实现(包括处理器、ABI、编译器、标准库)。您无法保证与 ;size_t
相同uintptr_t
。但这可能会发生(在 32 位 Linux x86 或 ARM 上,两者都是 32 位无符号整数)。
的目的size_t
是成为一个大小(特别是分配的内存块),而 的目的uintptr_t
是成为与指针相同位大小的无符号整数。
不同的编译器有不同的结果。如果您希望它们相同,则必须确保您的编译器设置为 32 位 Linux x86 或 ARM,然后它就会正确。