要探讨为什么size_t
需要存在以及我们如何到达这里:
在实用方面,size_t
并ptrdiff_t
保证是64个位宽上的64位的实施方案中,32个比特宽上的32位实现,等等。他们不能在不破坏旧代码的情况下,在每个编译器上强制使用任何现有类型来表示这一点。
甲size_t
或者ptrdiff_t
不一定是相同的作为intptr_t
或uintptr_t
。他们对仍然在使用的时候一定结构不同size_t
而ptrdiff_t
被添加到标准的80年代后期,并变得过时,当C99增加了许多新类型,但尚未消失(如16位Windows)。在16位保护模式下的x86具有分段存储器,其中最大可能的数组或结构的大小只能是65,536字节,但是far
指针需要32位宽,比寄存器宽。在这些,intptr_t
本来是32个位宽,但size_t
并ptrdiff_t
可以是16位宽并适合寄存器。谁知道将来会写什么样的操作系统?从理论上讲,i386体系结构提供了具有48位指针的32位分段模型,这是操作系统从未真正使用过的模型。
内存偏移量的类型之所以不能,是long
因为太多的旧代码假定该long
宽度恰好是32位宽。该假设甚至已内置到UNIX和Windows API中。不幸的是,许多其他遗留代码也假定a long
足够宽以容纳指针,文件偏移,自1970年以来经过的秒数等等。POSIX现在提供了一种标准的方法来强制使后一个假设正确,而不是前一个假设,但这两个都不是可移植的假设。
可能不是int
因为90年代只有极少数的编译器制作了int
64位宽。然后,通过保持long
32位宽,他们真的变得很奇怪。该标准的下一个修订版声明int
,其宽度大于long
,int
是非法的,但在大多数64位系统上仍为32位宽。
它不可能是long long int
,后来又添加了它,因为即使在32位系统上,它被创建为至少64位宽。
因此,需要一种新的类型。即使不是,所有其他类型也意味着数组或对象中的偏移量以外的其他内容。而且,如果从32到64位迁移的惨败中汲取了一个教训,那就是要明确类型需要具备的属性,而不要在不同的程序中使用不同的含义。
int
ifsome_size
签名,size_t
如果未签名。