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

用 empty() 判断字符串是否为空最直接
直接调用 s.empty() 是 C++ 标准推荐的方式,语义清晰、意图明确。它不依赖长度计算或内存访问模式,底层通常只是检查内部指针或大小字段是否为零,属于常数时间 O(1) 操作,且无副作用。
常见错误是写成 s.size() == 0 或 s.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'
这两种写法不仅低效,还容易出错:
立即学习“C++免费学习笔记(深入)”;
-
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 都能避开一次。










