可能重复:
size_t vs. intptr_t
我的一些代码处理指针并将uintptr_t
作为输入,因为它必须使用指针。
我现在必须用整数做同样的事情,所以我想重用那段代码。
size_t
与uintptr_t
相同吗?我是否可以通过将uintptr_t
替换为size_t
来更改实现并对指针和整数使用相同的代码?
答案 0 :(得分:15)
size_t
必须足够大才能包含最大的大小
可能的对象。 uintptr_t
必须足够大才能包含
任何指针。鉴于此,它或多或少得到保证
sizeof(uintptr_t) >= sizeof(size_t)
(因为所有字节都在
最大可能的对象必须是可寻址的,但不是更多。
在具有线性寻址的机器上,它们可能就是
相同的大小。另一方面,在分段体系结构上,它是
通常uintptr_t
大于size_t
,因为
对象必须在单个段中,但指针必须能够
解决所有的记忆。
答案 1 :(得分:2)
这取决于实现(包括处理器,ABI,编译器,标准库)。您无法保证size_t
与uintptr_t
相同;但这可能发生(在32位Linux x86或ARM上,都是32位无符号整数)。
size_t
的意图是一个大小(特别是分配的内存块),而uintptr_t
的意图是一个与指针相同位大小的无符号整数。
答案 2 :(得分:-1)
不同的编译器有不同的结果。如果你想要它们具有相同的效果,你必须确保你的编译器应该在32位Linux x86或ARM上,这是正确的。