<cstdint> 与 std::size_t 类型
Posted
技术标签:
【中文标题】<cstdint> 与 std::size_t 类型【英文标题】:<cstdint> vs std::size_t types 【发布时间】:2014-07-02 20:46:43 【问题描述】:根据我对boost
和libstdc++
的了解,只要事先不知道无符号/有符号索引的上限/下限,库通常会使用std::size_t
和std::ssize_t
。我的问题是:为什么不使用<cstdint>
中的uintmax_t
而不是std::size_t
和intmax_t
而不是std::ssize_t
?
【问题讨论】:
我认为std::ssize_t
不存在。 POSIX 定义了ssize_t
,但它不是 C++ 标准的一部分。 C++ 使用std::size_t
和std::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_t
和uintmax_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_t
和size_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
。
【讨论】:
但如果uintmax_t
大于size_t
,那么它可以包含比size_t
更大的对象的大小。
另外,boost
实现了它自己的<cstdint>
,就像cstdint.hpp
,看看boost.org/doc/libs/1_55_0/boost/cstdint.hpp
@user1095108 标准规定size_t
可以包含最大可能类型的大小。所以如果一个值不适合size_t
,它就不是一个对象的大小。以上是关于<cstdint> 与 std::size_t 类型的主要内容,如果未能解决你的问题,请参考以下文章