std:: size_t
|
定义于头文件
<cstddef>
|
||
|
定义于头文件
<cstdio>
|
||
|
定义于头文件
<cstdlib>
|
||
|
定义于头文件
<cstring>
|
||
|
定义于头文件
<ctime>
|
||
|
定义于头文件
<cuchar>
|
(C++17 起)
|
|
|
定义于头文件
<cwchar>
|
||
|
typedef
/* 由实现定义 */
size_t
;
|
||
std::size_t
是以下运算符结果的無符号整数类型:
| (自 C++11 起) |
如果程序试图构成过大的类型(即其
对象表示
中的字节数超过
std::size_t
可表示的最大值),则该程序是非良构的。
|
|
(since C++11) |
目录 |
注释
std::size_t
能够存储理论上任何类型对象(包括数组)的最大尺寸。在许多平台上(采用分段寻址的系统除外),
std::size_t
可以安全地存储任何非成员指针的值,此时它与
std::uintptr_t
同义。
std::size_t
通常用于数组索引和循环计数。若程序使用其他类型(如
unsigned
int
)进行数组索引,则可能在索引值超过
UINT_MAX
时(例如在64位系统上)失效,或当程序依赖32位模运算时出现异常。
在对C++容器进行索引时,例如
std::string
、
std::vector
等,合适的类型是这些容器提供的嵌套类型
size_type
。该类型通常被定义为
std::size_t
的同义词。
未指定是否在其他标准库头文件中可获取
std::size_t
的声明。即使标准要求使用
std::size_t
,实现仍可选择不引入该名称。
|
用于
|
(自 C++23 起) |
可能的实现
using size_t = decltype ( sizeof 0 ) ;
示例
#include <array> #include <cstddef> #include <iostream> int main() { std::array<std::size_t, 10> a; // 使用 C++23 std::size_t 字面量的示例 for (auto i = 0uz; i != a.size(); ++i) std::cout << (a[i] = i) << ' '; std::cout << '\n'; // 递减循环示例 for (std::size_t i = a.size(); i--;) std::cout << a[i] << ' '; std::cout << '\n'; // 注意这种朴素的递减循环: // for (std::size_t i = a.size() - 1; i >= 0; --i) ... // 会导致无限循环,因为无符号数始终非负 }
输出:
0 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 0
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 适用范围 | 发布时行为 | 正确行为 |
|---|---|---|---|
| CWG 1122 | C++98 |
std::size_t
存在循环定义问题
[1]
|
由实现定义 |
| CWG 1464 | C++98 |
对象大小可能无法用
std::size_t
表示
|
此类类型属于非良构 |
-
↑
std::size_t的定义与 C 语言中size_t的定义完全相同,即“ sizeof 运算符的结果类型”。在 C 语言中不存在循环定义问题,因为 C 语言中sizeof的结果类型是实现定义的无符号整型。
参考文献
- C++23 标准 (ISO/IEC 14882:2024):
-
- 6.8.4 复合类型 [basic.compound] (页码: 79-80)
-
- 7.6.2.5 Sizeof 运算符 [expr.sizeof] (页码: 136)
-
- 7.6.2.6 Alignof 运算符 [expr.alignof] (页码: 136)
-
- 17.2.4 大小、对齐和偏移量 [support.types.layout] (页码: 504-505)
- C++20 标准 (ISO/IEC 14882:2020):
-
- 6.8.3 复合类型 [basic.compound] (页码: 75-76)
-
- 7.6.2.5 Sizeof 运算符 [expr.sizeof] (页码: 129-130)
-
- 7.6.2.6 Alignof 运算符 [expr.alignof] (页码: 130)
-
- 17.2.4 大小、对齐和偏移量 [support.types.layout] (页码: 507-508)
- C++17 标准 (ISO/IEC 14882:2017):
-
- 6.9.2 复合类型 [basic.compound] (页码: 81-82)
-
- 8.3.3 Sizeof 运算符 [expr.sizeof] (页码: 121-122)
-
- 8.3.6 Alignof 运算符 [expr.alignof] (页码: 129)
-
- 21.2.4 大小、对齐和偏移量 [support.types.layout] (页码: 479)
- C++14 标准 (ISO/IEC 14882:2014):
-
- 3.9.2 复合类型 [basic.compound] (页码: 73-74)
-
- 5.3.3 Sizeof 运算符 [expr.sizeof] (页码: 109-110)
-
- 5.3.6 Alignof 运算符 [expr.alignof] (页码: 116)
-
- 18.2 类型 [support.types] (页码: 443-444)
- C++11 标准 (ISO/IEC 14882:2011):
-
- 5.3.3 Sizeof [expr.sizeof] (页码: 111)
-
- 5.3.6 Alignof [expr.alignof] (页码: 116)
-
- 18.2 类型 [support.types] (页码: 454-455)
- C++03 标准 (ISO/IEC 14882:2003):
-
- 5.3.3 Sizeof [expr.sizeof] (页: 79)
- C++98 标准 (ISO/IEC 14882:1998):
-
- 5.3.3 Sizeof [expr.sizeof] (页: 77)
参见
|
两个指针相减时返回的有符号整数类型
(类型别名) |
|
|
从
标准布局类型
起始处到指定成员的字节偏移量
(函数宏) |
|
| 整数字面量 | 二进制、 (C++14 起) 十进制、八进制或十六进制整数类型数字 |
|
C 文档
关于
size_t
|
|