整理了一些想法,抛砖引玉。
经验大多基于 C++17,工作中不需要对 C 暴露接口,偶尔会使用 C 库或者 C 风格的接口,在与 C 交互上是半吊子水平。
std::string_view
仅在 C++17 后才可用,对于没有条件的项目,可以考虑使用 Abseil 等三房库提供的 string_view
实现,但要留意第三方的实现和 std::string_view
可能并不保证完全可互换。
字符串常量
首先是避免使用 std::string
定义常量,在我的工作环境甚至会被扫描工具拦截。不使用原因包括:
std::string
会引发堆内存分配;std::string
析构函数非平凡,全局对象销毁顺序难以预测,存在生命周期结束后被访问的风险(例如该std::string
被其他全局对象引用)等。
近期搞的一些代码,大家习惯是使用 constexpr char[]
:
constexpr char kMyConstString[] = "hello world";
使用 constexpr char[]
本身没任何问题,只是很容易在调用中退化为 const char*
,导致取字符串长度的复杂度变为 O(n)。为了避免计算长度的开销,调用参数需要一路都额外带一个 int
或者 size_t
的长度。<