std::fill是最推荐方式,语义清晰、类型安全,编译器可优化为高效内存操作;需包含<algorithm>,传入迭代器范围如std::fill(arr, arr+100, 0)。

用 std::fill 最直接安全
对已定义的内置数组(如 int arr[100]),std::fill 是最推荐的方式:它语义清晰、类型安全,且编译器通常能优化成高效的内存操作。
- 必须包含头文件
<algorithm> - 注意传入的是迭代器范围:
std::fill(arr, arr + size, 0),不是std::fill(arr, size, 0) - 对
std::array同样适用:std::fill(my_arr.begin(), my_arr.end(), 0) - 不适用于未初始化的栈数组(如刚声明但未赋值的
int arr[10])——这不是“重置”,而是首次初始化,std::fill仍可安全使用
memset 快但有陷阱
memset 确实快,但它按字节填充,只适合所有字节为 0 即代表“零值”的类型(如 int、float、指针),不能用于含非平凡构造函数或虚函数的类类型。
- 必须包含
<cstring> - 正确写法:
memset(arr, 0, sizeof(arr))—— 第三个参数是字节数,不是元素个数 - 错误示范:
memset(arr, 0, N)(N 是元素个数)会导致只清前 N 字节,严重越界风险 - 对
std::vector<int>要用memset(&vec[0], 0, vec.size() * sizeof(int)),但更推荐std::fill避免手动算大小
构造时初始化比运行时重置更省事
如果数组生命周期内需多次“重置”,说明设计可能偏向频繁复用。此时在定义时就初始化,往往比后续反复清空更自然、更少出错。
- 栈数组:
int arr[100] = {}或int arr[100]{};(C++11 起支持) -
std::array<int, 100> arr{};—— 空括号触发值初始化,全部为 0 -
std::vector<int> vec(100, 0);—— 构造时指定初始值,无需额外重置步骤 - 注意:
std::vector<int> vec(100);只调默认构造(即int()→ 0),效果相同,但语义不如显式写0清晰
全局/静态数组自动清零,别白费力气
全局作用域或 static 修饰的内置数组,编译器保证初始值为 0,运行时无需任何重置操作。
立即学习“C++免费学习笔记(深入)”;
- 例如:
int global_arr[1000];所有元素在程序启动时就是 0 - 同理:
static int buf[256];每次函数返回后保留值,但首次进入时已是全 0 - 误用
std::fill或memset不报错,但纯属冗余,还可能掩盖逻辑问题(比如你以为它“上次被改过”,其实根本没动过)
真正容易漏掉的是类型安全性:拿 memset 去清 std::string 数组会直接破坏对象内部状态;而 std::fill 遇到不支持赋值的类型会在编译时报错,反而帮你提前发现问题。


















