

新闻资讯
技术教程std::format 是 C++20 引入的现代化、类型安全、可扩展的字符串格式化工具,它取代了易出错的 printf 和繁琐的 std::ostringstream,兼顾安全性、可读性与性能(在多数场景下比 printf 更快,尤其配合编译期检查时)。
最常用形式是 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():
{:x}:十六进制小写(std::format("{:x}", 255) → "ff"){:#x}:带前缀(→ "0xff"){:+d}:强制显示符号(→ "+42"){:>10}:右对齐,最小宽度 10(空格填充){:^8.3f}:居中、宽 8、保留 3 位小数所有说明符都在编译期解析(GCC/Clang 支持),非法格式如 {:z} 会直接报错,而不是运行时崩溃。
让自己的类参与 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("%s", 42) 是典型 UB,std::format 编译不过);自动处理宽字符、UTF-8 字符串;无缓冲区溢出隐患(不依赖固定大小字符数组)。
性能上:现代实现(如 libstdc++、libc++)采用栈上小字符串优化 + 零拷贝解析;格式串常量在编译期验证并预编译;实测在中等复杂度格式
下,吞吐量通常比 snprintf 高 10%–30%。
若需更高性能(如日志高频拼接),可结合 std::format_to 写入预分配 buffer,或使用 std::vformat 处理运行时格式串(但失去编译期检查)。