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)
情况相反。有没有什么真正的实现呢?这种方法还有其他有用的属性吗?
答案 0 :(得分:3)
一个典型的例子是8086。由于数组大小限制为64K段,size_t
可以是16位。但是,要支持范围为128 kB(-64kB至+ 64kB)的ptrdiff_t
,则需要17位。
这里的问题是指针类型不是琐碎的字节计数器,它在64 kB之后会回绕。
以下是stddef.h
的Borland C ++ 3.1摘录:
#if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__)
typedef long ptrdiff_t;
#else
typedef int ptrdiff_t;
#endif
typedef unsigned size_t;
因此,如果内存模型很大,很大或很紧凑(这些内存模型意味着数据可以大于64KiB),则sizeof(ptrdiff_t)
为4,而sizeof(size_t)
始终为2。 / p>