当前位置: 首页 > news >正文

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_tunsigned int (4 字节,范围 0 ~ 4,294,967,295)
    • 在 64 位平台默认 size_tunsigned long longunsigned long (8 字节,范围 0 ~ 18,446,744,073,709,551,615)
  • 保证足够大以存储任何对象在单个内存空间中的大小。

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] << " ";}
}

好处:isize_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、sizeofmallocstrlen 等接口中都会使用。
  • 注意它的无符号运算陷阱,尤其是与有符号整数混用时。
  • 跨平台开发时,size_t 比直接用 unsigned int 更安全。
http://www.dtcms.com/a/395655.html

相关文章:

  • C++ 拷贝构造函数调用时机
  • 手机镜头参数介绍
  • 区块链技术之《(1)—概述》
  • 复盘与导出工具最新版V31.0版本更新---彻底修复卡死闪退bug,盘中实时丝滑
  • 深入理解JVM类加载与垃圾回收机制
  • Ethernet/IP转ProfiNet网关选型指南:欧姆龙PLC对接研祥工控机最佳实践
  • Java 面试高频手撕题清单
  • 【论文阅读】Long-VLA:释放视觉语言动作模型在机器人操作中的长时程能力
  • Python poplib 库全解析:POP3 邮件收取的完整指南
  • DanceTrack数据集介绍
  • 【无标题】话题学习笔记1,话题基本了解
  • 【论文阅读】OpenVLA:一个开源的视觉-语言-动作模型
  • 科技信息差(9.22)
  • Zotero中进行文献翻译【Windows11】【新版,目前没发现bug】
  • 单细胞数据分析:单细胞计数矩阵(Seurat)
  • Hyperf使用视图
  • React何时用函数组件(Hooks),何时用类组件?(错误边界用类组件Error Boundary)
  • VMware虚拟机ubuntu20.04共享文件夹突然无法使用
  • 流行AI工具的分类与比较
  • 哪些行业需要使用时序数据库?
  • PyTorch 神经网络工具箱简明笔记
  • Pytorch目录细查
  • VMware的Ubuntu与windows共享文件夹
  • RK3588-ubuntu server
  • EPLAN绘制安全回路核心步骤
  • 仁合医疗靠谱吗?——社会责任担当,科技赋能医疗
  • R语言 生物信息 GEO 数据集 GPL5175 平台中一个探针的 gene_assignment 字段内容解读
  • ReactPress 2.0 — 基于 React、Next.js 和 NestJS 构建的现代化全栈发布平台
  • 52Hz——FreeRTOS学习笔记
  • 回归分析:数据驱动时代的 “因果纽带” 与 “预测锚点”—— 技术深潜与方法论破局