什么时候可以sizeof(size_t)和sizeof(ptrdiff_t)不同?
这有什么现实世界的例子吗?
注意,我知道所有标准都说这些类型是实现定义的.但是,所有的实现,我知道,sizeof(size_t)和sizeof(ptrdiff_t)平等.也许是因为一些奇怪(或不那么奇怪)的原因,它们可能会有所不同.
看起来,这sizeof(ptrdiff_t)<sizeof(size_t)不是一个非常有用的情况,因为对于大型数组,指针算法将非常有限.
另一种情况sizeof(ptrdiff_t)>sizeof(size_t)可能稍微有用,因为所有指针减法都将在数组上定义(如果有一个更大的数组PTRDIFF_MAX,则将为所有远程元素定义指针减法,与通常的情况相反sizeof(ptrdiff_t)==sizeof(size_t)).有没有真正的实现呢?这种方法是否还有其他有用的属性?
一个合理的例子是经典的 8086。数组大小限制为 64K 段,size_t可以是 16 位。但是,要支持ptrdiff_t128 kB 范围(-64kB 到 +64kB),您需要 17 位。
这里的问题是指针类型不是一个在 64 kB 之后回绕的简单字节计数器。
以下是 Borland C++ 3.1 的摘录stddef.h:
#if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__)
typedef long ptrdiff_t;
#else
typedef int ptrdiff_t;
#endif
typedef unsigned size_t;
Run Code Online (Sandbox Code Playgroud)
因此,如果内存模型很大、巨大或紧凑(这些内存模型意味着数据可以大于 64KiB),则sizeof(ptrdiff_t)为 4 ,而sizeof(size_t)始终为 2。