为什么在C(和C++)标准中,uintptr_t和intptr_t是可选类型?

16

使用C99标准(及以后版本),需要在头文件<stdint.h>中提供某些类型。对于精确宽度,例如int8_tint16_t等,它们是可选的,并且标准中解释了为什么这样做。

但是对于uintptr_tintptr_t类型,它们也是可选的,但我没有看到它们作为必需类型而不是可选类型的原因。


3
可能会存在硬件无法有效支持这些功能,因此标准不能要求使用它们。对于常见的平台,你可以假设它们存在 - 如果在你选择的平台上不存在,你会知道的。 - Jesper Juhl
@JesperJuhl:在我看来,这是一个值得质疑的设计决策。即使uintptr_t不够高效,拥有它也比没有更好。有些问题只能通过这种类型(以实现定义的方式)来解决。因此,优质的实现应该始终提供此类型。 - geza
@geza 如果仔细想想,使用以“实现定义”方式使用的可移植类型并没有太大意义... - Arne Vogel
1
@ArneVogel:看起来是个矛盾,但实际上并不是。如果uintptr_t始终可用,则使用它的程序可以更具可移植性,因为您不必担心它是否可用。在某些问题中,精确的转换并不重要。例如,异或链表。我认为高质量的实现应该做出预期的事情:例如,将1添加到TYPE *应该与将sizeof(TYPE)添加到转换后的整数相同(因此可以避免expr.add的未定义行为)。 - geza
1个回答

16

在一些平台上,指针类型的大小比任何整数类型都大得多。我相信这样的平台例子包括使用虚拟指令集将所有指针定义为128位的IBM AS/400。另一个更近期的例子是Elbrus,它使用128位指针,这些指针是硬件描述符而不是普通地址。


2
@BoR 当然可以,那么x86实模式怎么样?其中地址长度为20位,但机器字长为16位。 - Govind Parmar
1
@GovindParmar,仅因为x86实模式的机器字大小仅为16位,并不意味着该平台的C实现没有一个整数类型可以容纳所有指针值。事实上,“long int”和“unsigned long int”是非可选的,并且需要至少具有31和32个值位。 - John Bollinger
5
@Oliv: 必须有更多。2的128次方约为10的38次方。地球质量约为610^24公斤。如果我们使用非常重的原子,其中一个摩尔质量为1千克,则地球拥有610^24610^23=3.6*10^48个原子。至少,这是一个非常保守的估计。这远高于2的128次方。 :) - geza
3
宇宙中估计有约10^80个原子,这比2^128多了3*10^41倍。 - bolov
4
如果使用了有界指针或者指针被定义为对象ID、偏移量和其他相关信息的元组,以确保内存安全实现,这种情况下也同样适用。 - R.. GitHub STOP HELPING ICE
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接