<cstdint> 与 std::size_t 类型

Posted

技术标签:

【中文标题】<cstdint> 与 std::size_t 类型【英文标题】:<cstdint> vs std::size_t types 【发布时间】:2014-07-02 20:46:43 【问题描述】:

根据我对boostlibstdc++ 的了解,只要事先不知道无符号/有符号索引的上限/下限,库通常会使用std::size_tstd::ssize_t。我的问题是:为什么不使用&lt;cstdint&gt; 中的uintmax_t 而不是std::size_tintmax_t 而不是std::ssize_t

【问题讨论】:

我认为std::ssize_t 不存在。 POSIX 定义了ssize_t,但它不是 C++ 标准的一部分。 C++ 使用std::size_tstd::ptrdiff_t @CrisLuengo 我想我曾经尝试使用std::ssize_t 并且它起作用了。当然这是特定于编译器的。 【参考方案1】:

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

【讨论】:

另外,size_t 更具描述性,可以适当地小于uintmax_t 您似乎忘记了size_t 也是C 标准的一部分,但C 库也更喜欢使用size_t 而不是uintmax_t 正如我所说的 stdint.h 是 C99,你也可以使用相同的 C lib 来编译 C89。【参考方案2】:

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

此外,架构可能会被限制为较小的事物,因此 size_t 可能并不总是最大的整数类型。虽然我觉得那会有点奇怪。

【讨论】:

size_t 不是最大整数类型在平台位数小于 64 位或存在扩展范围整数时很常见。 特别是,size_t 不是最大整数类型是 x86 上的常态。 @Deduplicator:我应该说最大的自然整数类型吗?我知道编译器可以在 32 位系统上合成 64 位操作,但实际的机器指令是 32 位的。 在涉及intmax_tuintmax_t 的问题中,“最大整数类型”很明显并不意味着最大的“自然”整数类型,不管“自然”是什么意思,但即便如此:我最近没用过 x32,但我似乎记得 size_t 仍然是 32 位,即使 64 位寄存器和指令可用。 @hvd 永远是sizeof(size_t) sizeof(uintmax_t)。你能举个例子吗,这是什么情况?【参考方案3】:

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_types 通常与size_t 相同,因此在处理sizeof 或STL 容器的代码中使用size_t 是有意义的。

现在,&lt;cstdint&gt; 对 C++ 来说是新事物,我认为很清楚为什么像 Boost 这样的已建立的库一直在使用 size_t

【讨论】:

但如果uintmax_t 大于size_t,那么它可以包含比size_t 更大的对象的大小。 另外,boost 实现了它自己的&lt;cstdint&gt;,就像cstdint.hpp,看看boost.org/doc/libs/1_55_0/boost/cstdint.hpp @user1095108 标准规定size_t 可以包含最大可能类型的大小。所以如果一个值不适合size_t,它就不是一个对象的大小。

以上是关于<cstdint> 与 std::size_t 类型的主要内容,如果未能解决你的问题,请参考以下文章

如何将矢量元素提供给模板

虚拟方法的 C++ 部分模板特化

VS2010对C++11的支持程度

几种伪随机数算法

通过 move_pages() 查询失败

不同数值类型的相同比较