`size_t` 是一个无符号整数类型(unsigned integer type),它的具体大小取决于系统架构:
1. 在不同系统上的大小:
```cpp
// 32位系统
size_t = unsigned int // 4字节 (0 到 4,294,967,295)
// 64位系统
size_t = unsigned long long // 8字节 (0 到 18,446,744,073,709,551,615)
```
1. 为什么使用 `size_t`:
- 专门用于表示大小、长度、计数等非负值
- 保证能够表示系统中任何对象的大小
- 在不同系统上自动选择合适的大小
1. 常见用法:
```cpp
size_t len = str.length(); // 字符串长度
size_t size = vector.size(); // 容器大小
size_t capacity = 1024; // 缓冲区容量
size_t i = 0; // 循环计数器
// 在循环中使用
for (size_t i = 0; i < str.length(); i++) {
// ...
}
```
1. 对比其他类型:
```cpp
// C++
int // 有符号,通常4字节,-2,147,483,648 到 2,147,483,647
long // 有符号,4或8字节(取决于系统)
size_t // 无符号,4或8字节(取决于系统),总是 >= 0
```
```java
// Java
int // 4字节,-2,147,483,648 到 2,147,483,647
long // 8字节,-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
```
1. 注意事项:
```cpp
// 小心负数!
size_t x = 10;
x = x - 20; // 危险!会变成一个很大的正数,因为 size_t 是无符号的
// 正确的做法是先检查
if (x >= 20) {
x = x - 20;
} else {
// 处理错误情况
}
```
所以总结:
1. `size_t` 不是 `long` 也不是 `int`,而是一个独立的无符号类型
2. 它的大小是平台相关的(4或8字节)
3. 它专门用于表示大小和索引
4. 它总是非负的
5. 在 ByteStream 这样的实现中,用 `size_t` 来表示缓冲区大小和读写长度是最合适的