什么时候sizeof(size_t)和sizeof(ptrdiff_t)不同?

时间:2018-08-13 10:48:11

标签: c++

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)情况相反。有没有什么真正的实现呢?这种方法还有其他有用的属性吗?

1 个答案:

答案 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>