C++ 为什么在C(和C+;+;)标准中uintptr和intptr是可选类型?
对于C99(及更高版本的标准),标准要求某些类型在标题C++ 为什么在C(和C+;+;)标准中uintptr和intptr是可选类型?,c++,c,c++11,c99,C++,C,C++11,C99,对于C99(及更高版本的标准),标准要求某些类型在标题中可用。对于确切的宽度,例如,int8\u t,int16\u t等,它们是可选的,并且在标准中是受激励的 但是对于uintpr\u t和intptr\u t类型,它们也是可选的,但我不认为它们是可选的而不是必需的。在某些平台上,指针类型的大小比任何整型都大。我相信这样一个平台的例子是IBMAS/400,它的虚拟指令集将所有指针定义为128位。这类平台最近的一个例子是Elbrus。它使用128位指针,这些指针是硬件描述符,而不是普通地址。有这
中可用。对于确切的宽度,例如,int8\u t
,int16\u t
等,它们是可选的,并且在标准中是受激励的
但是对于
uintpr\u t
和intptr\u t
类型,它们也是可选的,但我不认为它们是可选的而不是必需的。在某些平台上,指针类型的大小比任何整型都大。我相信这样一个平台的例子是IBMAS/400,它的虚拟指令集将所有指针定义为128位。这类平台最近的一个例子是Elbrus。它使用128位指针,这些指针是硬件描述符,而不是普通地址。有这样的平台吗?@BoR当然,x86实模式怎么样,地址是20位长,但机器字大小是16位?@Oliv:肯定还有更多。2^128等于~10^38。地球质量约为6*10^24千克。如果我们用非常重的原子,摩尔数是1kg,那么地球有6*10^24*6*10^23=3.6*10^48个原子。至少,这是一个非常悲观的估计。这远高于2^128。:)有,也就是:)对于具有有界指针的实现,或者指针是某种类型的对象id、偏移量的元组,以及可能支持内存安全实现的其他信息的实现,也是如此。可能存在无法(有效)支持它们的硬件。因此,标准不能强制要求他们。对于普通平台,你几乎可以假设它们存在——如果它们不在你选择的平台上,你就会知道它们是否存在。@JesperJuhl:在我看来,这是一个值得怀疑的设计决策。即使一个uintptru\t
是无效的,拥有它也比没有它更好。有些问题只能通过这种类型(以实现定义的方式)来解决。所以一个高质量的实现应该始终提供这种类型。@geza有一个可移植的类型以实现定义的方式使用没有多大意义,想想看…@ArneVogel:这似乎是一个矛盾,但事实并非如此。如果uintptru\t
始终可用,那么使用它的程序可以更方便地移植,因为您不必担心它是否可用。有一些问题,精确的转换并不重要。例如,xor链表。我认为一个高质量的实现应该做到预期的事情:例如,将1添加到TYPE*
中应该与将sizeof(TYPE)
添加到转换的整数中一样(因此可以避免expr.add的未定义行为)。