<cstdint> VS 标准::size_t类型

<cstdint> vs std::size_t types

本文关键字:size 类型 VS lt cstdint gt 标准      更新时间:2023-10-16

从我对boostlibstdc++的观察来看,库通常在事先不知道无符号/有符号索引的上限/下限时使用std::size_tstd::ssize_t。我的问题是:为什么不使用<cstdint>uintmax_t而不是std::size_tintmax_t而不是std::ssize_t ?

前者是c++标准的一部分,后者不是。更准确地说,cstdint头文件是最近才引入的(在c++ 11中)。这样做的原因是stdint.h本身是C99的一部分,C99比c++ 98更新。

c++ 11标准(第18.2节)规定:

(5)。ptrdiff_t类型是一个实现定义的有符号整数类型,可以保存数组对象中两个下标的差值....

(6)。size_t类型是一个实现定义的无符号整数类型,它足够大,可以包含任何对象的字节大小。

(7)。[注意:建议为ptrdiff_tsize_t选择整数转换排名(4.13)不大于signed long int的类型,除非需要更大的大小来包含所有可能的值。端注意

)

从这里我们可以看到:

size_t专门针对对象的字节大小,它的同伴ptrdiff_t专门针对具有数组索引的数学。而uintmax_t则是最大的无符号整型。

根据平台的不同,uintmax_t可能大于size_t

我们还知道:

sizeof返回size_t,而STL容器size_type s通常与size_t相同,因此在处理sizeof或STL容器的代码中使用size_t是有意义的。

现在,考虑到<cstdint>对c++来说是新的,我认为很清楚为什么像Boost这样的成熟库一直在使用size_t

因为size_t类型用来描述事物的大小。使用它们表示大小比使用uint_t更具有描述性。

同样,一个架构可能被限制为更小的东西,所以size_t可能并不总是最大的整数类型。虽然我觉得那样会有点奇怪