std::print从C++23起被引入,旨在替代iostream和printf,提供类型安全、高效且简洁的格式化输出,支持format全部语法,避免临时对象开销,并保证多线程下原子输出。

从 C++23 开始,std::print 被引入标准库,标志着 C++ 终于拥有了一种现代、高效、类型安全的格式化输出方式。它基于 std::format,旨在替代传统 和 C 风格的 printf,让格式化输出变得更简洁、更安全、更快速。
为什么需要 std::print?
在 C++23 之前,开发者通常依赖以下两种方式做输出:
- iostream(如 cout):类型安全但语法冗长,格式控制复杂,扩展性差。
- printf 系列函数:格式灵活,性能好,但缺乏类型安全,容易引发崩溃或未定义行为。
std::print 结合了两者的优点:像 printf 一样使用格式字符串,又像 iostream 一样具备编译时类型检查,还避免了缓冲区溢出等常见问题。
std::print 的基本用法
std::print 定义在头文件 中,使用方式非常直观:
立即学习“C++免费学习笔记(深入)”;
#includeint main() { std::print("Hello, {}\n", "world"); std::print("Value: {}, Address: {:p}\n", 42, &42); return 0; }
它支持 std::format 的全部格式语法,比如对齐、填充、精度、进制转换等:
std::print("{:>10}\n", 123); // 右对齐,宽度10
std::print("{:#x}\n", 255); // 输出 0xff
std::print("{:.2f}\n", 3.14159); // 保留两位小数
性能优势:减少临时对象,直接写入输出流
与先调用 std::format 构造字符串再输出不同,std::print 直接将格式化内容写入 stdout,避免了中间字符串的构造和内存分配:
- std::format + std::cout:先生成临时字符串,再输出,有额外开销。
- std::print:格式化过程直接流向输出缓冲区,效率更高。
这对于日志系统、高频输出场景尤其重要。
线程安全与原子输出
std::print 保证整条输出是原子的——不会被其他线程的输出打断。这意味着多线程下打印一条完整消息时,内容不会交错。
而多个 std::cout
基本上就这些。std::print 不仅让代码更简洁,也解决了长期困扰 C++ 开发者的格式化输出痛点。虽然目前编译器支持还在推进中(如 MSVC 已支持,GCC 需较新版本),但它代表了 C++ I/O 的未来方向。告别繁琐的 iostream 操作符重载和不安全的 printf,C++ 的输出终于变得既现代又可靠。











