
std::format 是 C++20 引入的现代化、类型安全、可扩展的字符串格式化工具,它取代了易出错的 printf 和繁琐的 std::ostringstream,兼顾安全性、可读性与性能(在多数场景下比 printf 更快,尤其配合编译期检查时)。
基础用法:像 Python f-string 一样简洁
最常用形式是 std::format(fmt, args...),返回 std::string:
-
std::format("Hello, {}!", "World")→"Hello, World!" -
std::format("Pi ≈ {:.2f}", 3.14159)→"Pi ≈ 3.14" -
std::format("ID: {:04d}, Name: {}", 7, "Alice")→"ID: 0007, Name: Alice"
占位符 {} 自动推导类型,无需手动指定 %s、%d 等格式符,彻底避免类型不匹配导致的未定义行为。
格式说明符:精准控制输出样式
在 {} 内添加冒号后跟说明符,语法类似 Python 的 str.format():
立即学习“C++免费学习笔记(深入)”;
-
{:x}:十六进制小写(std::format("{:x}", 255)→"ff") -
{:#x}:带前缀(→"0xff") -
{:+d}:强制显示符号(→"+42") -
{:>10}:右对齐,最小宽度 10(空格填充) -
{:^8.3f}:居中、宽 8、保留 3 位小数
所有说明符都在编译期解析(GCC/Clang 支持),非法格式如 {:z} 会直接报错,而不是运行时崩溃。
支持自定义类型:只需提供 formatter 特化
让自己的类参与 std::format,只需为该类型特化 std::formatter:
struct Point { int x, y; };
template<> struct std::formatter : std::formatter {
auto format(const Point& p, format_context& ctx) const {
return fmt::format_to(ctx.out(), "({},{})", p.x, p.y);
}
};
之后就能直接使用:std::format("Origin: {}", Point{0,0}) → "Origin: (0,0)"。注意:标准库目前仅要求实现 std::format 基础支持,完整自定义需搭配 头文件和符合要求的编译器(如 GCC 13+、Clang 15+、MSVC 19.32+)。
性能与安全优势:为什么比 printf 更可靠
安全性上:无格式串/参数数量/类型错配风险(printf("%s", 42) 是典型 UB,std::format 编译不过);自动处理宽字符、UTF-8 字符串;无缓冲区溢出隐患(不依赖固定大小字符数组)。
性能上:现代实现(如 libstdc++、libc++)采用栈上小字符串优化 + 零拷贝解析;格式串常量在编译期验证并预编译;实测在中等复杂度格式下,吞吐量通常比 snprintf 高 10%–30%。
若需更高性能(如日志高频拼接),可结合 std::format_to 写入预分配 buffer,或使用 std::vformat 处理运行时格式串(但失去编译期检查)。











