<cstdint> VS 标准::size_t类型
<cstdint> vs std::size_t types
从我对boost
和libstdc++
的观察来看,库通常在事先不知道无符号/有符号索引的上限/下限时使用std::size_t
和std::ssize_t
。我的问题是:为什么不使用<cstdint>
的uintmax_t
而不是std::size_t
和intmax_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_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
。
因为size_t类型用来描述事物的大小。使用它们表示大小比使用uint_t更具有描述性。
同样,一个架构可能被限制为更小的东西,所以size_t可能并不总是最大的整数类型。虽然我觉得那样会有点奇怪
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 为什么我必须在初始化 std::array<SomeStruct, size> 时指定每个项目的类型C++
- 数组类型 'float [size]'不可分配
- 请求使用 .empty 或 .size 的非类类型的成员
- 如何声明将使用 map.size() 计算的 int 类型
- 为什么 std::array::size constexpr 具有简单类型(int、double、..),而不是 std
- 为什么引用类型的sizeof会给你该类型的size
- 可以将vector.size()的结果存储到int类型的变量中吗
- c++中string.size()的类型是什么?
- 表达式必须具有size()的类类型