从我已经进入boost
和libstdc++
开始,每当无符号/的上限/下限时,库通常会使用std::size_t
和std::ssize_t
已签名的索引事先未知。我的问题是:为什么不使用uintmax_t
中的<cstdint>
代替std::size_t
和intmax_t
代替std::ssize_t
?
答案 0 :(得分:3)
前者是C ++标准的一部分,后者则不是。更准确地说,cstdint
标题最近才被引入(在C ++ 11中)。原因是stdint.h
本身是C99的一部分,它比C ++ 98更新。
答案 1 :(得分:2)
因为size_t类型旨在描述事物的大小。将它们用于尺寸比uint_t更具描述性。
此外,架构可能仅限于较小尺寸的东西,因此size_t可能并不总是最大的整数类型。虽然我觉得这有点奇怪。
答案 2 :(得分:2)
C ++ 11标准(第8.12节)说:
(5)。类型
ptrdiff_t
是一个实现定义的有符号整数类型,它可以保存数组对象中两个下标的差异....(6)。类型
size_t
是一种实现定义的无符号整数类型,其大小足以包含任何对象的字节大小。(7)。 [注意:建议实施选择
ptrdiff_t
和size_t
的类型,其整数转换等级(4.13)不大于signed long int
的类型,除非更大大小是包含所有可能值的必要条件。 -end note ]
由此我们看到:
size_t
专门用于对象的字节大小,其伴随ptrdiff_t
专门用于数组索引的数学。另一方面,uintmax_t
是最大的无符号整数类型。
具体取决于平台uintmax_t
可能大于size_t
。
我们也知道:
sizeof
返回size_t
,而STL容器size_type
通常与size_t
相同,因此在代码中使用size_t
是有意义的处理sizeof
或STL容器。
现在混合<cstdint>
是C ++的新事物,我认为很明显为什么像Boost这样的已建立的库一直在使用size_t
。