代码之家  ›  专栏  ›  技术社区  ›  geza

什么时候sizeof(sizeof)和sizeof(ptrdiff)可以不同?

c++
  •  6
  • geza  · 技术社区  · 7 年前

    什么时候可以 sizeof(size_t) sizeof(ptrdiff_t) 不同吗?

    有什么真实的例子吗?


    注意,我知道所有的标准都说这些类型是实现定义的。但我知道的所有实现, 尺寸(尺寸) 尺寸(ptrdiff_t) 等于。也许出于某种奇怪(或者不那么奇怪)的原因,他们会有所不同。

    看来 sizeof(ptrdiff_t)<sizeof(size_t) 不是很有用的情况,因为指针算法对于大型数组来说非常有限。

    另一个案子, sizeof(ptrdiff_t)>sizeof(size_t) 可能稍微有用,因为所有指针减法都是在数组上定义的(如果数组大于 PTRDIFF_MAX ,将为所有远程元素定义指针减法,这与 sizeof(ptrdiff_t)==sizeof(size_t) )中。有什么真正的实现可以做到这一点吗?这种方法还有其他有用的特性吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   geza    7 年前

    一个合理的例子是经典的8086。阵列大小限制为64K段, size_t 可以是16位。但是,为了支持 ptrdiff_t 128 KB范围(-64 KB到+64 KB)需要17位。

    这里的问题是指针类型不是一个简单的字节计数器,它在64KB之后换行。


    以下是 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。