【发布时间】:2012-12-13 13:54:48
【问题描述】:
可能重复:
size_t vs. intptr_t
我的一些代码处理指针并将uintptr_t 作为输入,因为它必须使用指针。
我现在必须对整数做同样的事情,所以我想重用该代码。
size_t 和 uintptr_t 一样吗?我可以通过将uintptr_t 替换为size_t 来更改实现并对指针和整数使用相同的代码吗?
【问题讨论】:
可能重复:
size_t vs. 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,然后它就会正确。
【讨论】: