17370845950

C++ 怎么判断字符串为空 C++ string empty函数与size比较效率对比【优化】
用 empty() 判断字符串是否为空最直接,语义清晰、O(1) 无副作用,比 size()==0 更安全高效,尤其在临时对象、调试构建及特殊字符串类型中优势明显,应优先使用。

empty() 判断字符串是否为空最直接

直接调用 s.empty() 是 C++ 标准推荐的方式,语义清晰、意图明确。它不依赖长度计算或内存访问模式,底层通常只是检查内部指针或大小字段是否为零,属于常数时间 O(1) 操作,且无副作用。

常见错误是写成 s.size() == 0s.length() == 0 —— 虽然结果等价,但可读性差,且在某些老旧编译器或 debug 模式下可能触发不必要的 size 计算(尽管现代标准库基本都做了优化)。

empty()size() == 0 在性能上几乎没差别,但有隐含风险

理论上,empty() 可能比 size() == 0 略快,因为不需要返回完整 size 值(比如对 SSO 字符串,size() 可能需从标志位解码长度,而 empty() 直接查一个 bit)。但实际差异微乎其微,主流编译器(GCC/Clang/MSVC)在 -O2 下基本会把两者优化成相同汇编。

  • 真正要注意的是:如果 string 是 const 引用或来自表达式(如 get_name().empty()),empty() 更安全——不会意外延长临时对象生命周期(而 get_name().size() 同样安全,但语义弱)
  • 调试构建中,某些 STL 实现会对 size() 做额外检查(比如验证内部状态),带来轻微开销;empty() 一般跳过这些
  • 对自定义分配器或特殊 string 类型(如 absl::string_view),empty() 是唯一通用接口;size() 不一定存在或行为一致

别用 == "".c_str()[0] == '\0'

这两种写法不仅低效,还容易出错:

  • s == "" 触发完整字符串比较,至少要检查首字节+长度,最坏 O(n),且构造空字符串临时对象
  • s.c_str()[0] == '\0' 对空字符串虽可行,但依赖 C 风格字符串保证,若 s 是 move 后的无效状态或未初始化,可能访问非法内存
  • 更隐蔽的问题:c_str() 在 C++11 前不保证以 '\0' 结尾(现在已保证),但依然没必要绕路

在循环或 hot path 中优先用 empty(),但不必为此重构旧代码

如果你正在写新逻辑,或者在性能敏感路径(比如解析千兆日志的每行处理)中频繁判断,统一用 empty() 是稳妥选择。但已经大量存在的 size() == 0 不必刻意替换——除非你发现 profiler 明确指出该处是瓶颈,且换用后实测有提升。

真正容易被忽略的是:当字符串来自外部输入(如网络、文件)且可能极大时,empty() 的“绝对安全”优势才凸显出来——它不触发任何缓冲区访问或 length 解码,连 CPU

cache miss 都能避开一次。