C++ 中 size_t 的用(用于跨平台编译)
1. 什么是 size_t
size_t
是 C 和 C++ 标准库中定义的一种无符号整数类型(即 unsigned integer type),通常用于表示对象或数组在内存中的大小或下标索引。
它的定义在头文件中(取决于使用的库):
#include <cstddef> // 在 C++
#include <stddef.h> // 在 C
#include <cstdlib> // 也可以间接包含
本质:
size_t
的实际底层类型依赖平台和编译器,比如:- 在 32 位平台默认
size_t
是unsigned int
(4 字节,范围 0 ~ 4,294,967,295) - 在 64 位平台默认
size_t
是unsigned long long
或unsigned long
(8 字节,范围 0 ~ 18,446,744,073,709,551,615)
- 在 32 位平台默认
- 保证足够大以存储任何对象在单个内存空间中的大小。
2. 为什么需要 size_t
size_t
出现的目的是适配不同平台:
- 如果你直接用
unsigned int
存储数组长度或内存大小,在 64 位系统上可能不够大。 size_t
可以在不同架构下自动采用合适的宽度,保证能表达当前系统上的最大地址范围。
所以在 C++ 的标准库函数中,涉及对象大小、数组长度、容器 size 等的接口都会使用 size_t
。
3. 常见用法
3.1 表示对象大小
sizeof
运算符的返回值类型就是 size_t
:
#include <iostream>
#include <cstddef>int main() {size_t size_int = sizeof(int);size_t size_double = sizeof(double);std::cout << "sizeof(int) = " << size_int << '\n';std::cout << "sizeof(double) = " << size_double << '\n';
}
输出:
sizeof(int) = 4
sizeof(double) = 8
3.2 数组索引和长度
STL 容器的 .size()
方法返回值是 size_t
:
#include <iostream>
#include <vector>int main() {std::vector<int> v = {1, 2, 3};for (size_t i = 0; i < v.size(); ++i) {std::cout << v[i] << " ";}
}
好处:i
用 size_t
避免了负数索引的出现。
3.3 内存分配
C 标准库函数 malloc()
、calloc()
参数类型是 size_t
:
#include <cstdlib>
#include <iostream>int main() {size_t n = 10;int* arr = (int*) std::malloc(n * sizeof(int));if (arr) {// 使用 arrstd::free(arr);}
}
3.4 字符串操作
strlen()
返回类型是 size_t
:
#include <cstring>
#include <iostream>int main() {const char* str = "Hello";size_t len = std::strlen(str);std::cout << "Length: " << len << '\n';
}
4. 使用 size_t
时的注意事项
4.1 无符号整数的陷阱
size_t
是无符号类型,和有符号类型混合运算可能出现意想不到的结果:
#include <iostream>int main() {int a = -5;size_t b = 10;if (a < b) {std::cout << "a < b\n";} else {std::cout << "a >= b\n";}
}
即使 a = -5
,输出可能是 “a >= b”,因为比较时 a
先转成 size_t
,变成一个非常大的无符号数。
建议:在循环或数值比较中,避免让 size_t
和有符号类型直接比较,必要时显式类型转换。
4.2 用在循环时
在逆序遍历时要特别小心:
#include <iostream>
#include <vector>int main() {std::vector<int> v = {1, 2, 3};// 错误写法for (size_t i = v.size() - 1; i >= 0; --i) {std::cout << v[i] << " ";}
}
这是 死循环,因为 i
是无符号数,i >= 0
永远成立。
正确写法:
for (size_t i = v.size(); i-- > 0; ) {std::cout << v[i] << " ";
}
或者用有符号数:
for (int i = (int)v.size() - 1; i >= 0; --i) {std::cout << v[i] << " ";
}
5. 总结
size_t
是无符号整数类型,保证能表示当前平台任何对象的大小。- 广泛用于数组下标、容器大小、内存分配、字符串长度等场景。
- 在 STL、
sizeof
、malloc
、strlen
等接口中都会使用。 - 注意它的无符号运算陷阱,尤其是与有符号整数混用时。
- 跨平台开发时,
size_t
比直接用unsigned int
更安全。