0


{fmt}:高效、安全的C++格式化库

{fmt}:高效、安全的C++格式化库

fmt A modern formatting library 项目地址: https://gitcode.com/gh_mirrors/fm/fmt

项目介绍

{fmt} 是一个开源的C++格式化库,旨在提供比C标准库的stdio和C++的iostreams更快、更安全的替代方案。它不仅实现了C++20的

std::format

和C++23的

std::print

,还提供了类似于Python的格式化字符串语法。{fmt} 的设计目标是高性能、小代码体积、高可靠性和易用性,适用于各种C++项目。

项目技术分析

{fmt} 的核心技术包括:

  • 格式化API:提供简单且支持位置参数的格式化API,便于本地化。
  • C++20/23标准实现:完全兼容C++20的std::format和C++23的std::print
  • 高性能浮点格式化:使用Dragonbox算法,确保IEEE 754浮点数的正确舍入、短格式和往返保证。
  • 安全printf实现:支持POSIX扩展的位置参数,避免缓冲区溢出。
  • 可扩展性:支持用户自定义类型的格式化。
  • 高可靠性:通过广泛的测试和持续的模糊测试确保代码的可靠性。

项目及技术应用场景

{fmt} 适用于以下场景:

  • 高性能计算:在需要快速格式化大量数据的场景中,如科学计算、数据处理等。
  • 嵌入式系统:由于其小代码体积和高效性能,适合资源受限的嵌入式环境。
  • 跨平台开发:提供一致的输出和良好的跨平台支持,适用于多平台开发。
  • 安全敏感应用:通过类型安全检查和自动内存管理,减少格式化错误和缓冲区溢出风险。

项目特点

  • 高性能:比常见的标准库实现(如(s)printf、iostreams、to_stringto_chars)更快。
  • 小代码体积:最小配置仅包含三个文件,编译后的代码体积小。
  • 高可靠性:通过广泛的测试和持续的模糊测试确保代码的可靠性。
  • 安全性:完全类型安全,错误格式字符串可在编译时报告,自动内存管理防止缓冲区溢出。
  • 易用性:代码库小且自包含,无外部依赖,采用宽松的MIT许可证。
  • 跨平台支持:在不同平台上提供一致的输出,支持旧版编译器。
  • 警告自由:即使在高警告级别(如-Wall -Wextra -pedantic)下,代码库也保持干净无警告。
  • 本地独立:默认情况下不依赖于本地化设置。
  • 可选头文件配置:通过FMT_HEADER_ONLY宏启用头文件配置。

示例代码

以下是一些使用{fmt}的示例代码:

打印到标准输出

#include <fmt/core.h>

int main() {
  fmt::print("Hello, world!\n");
}

格式化字符串

std::string s = fmt::format("The answer is {}.", 42);
// s == "The answer is 42."

使用位置参数格式化字符串

std::string s = fmt::format("I'd rather be {1} than {0}.", "right", "happy");
// s == "I'd rather be happy than right."

打印日期和时间

#include <fmt/chrono.h>

int main() {
  auto now = std::chrono::system_clock::now();
  fmt::print("Date and time: {}\n", now);
  fmt::print("Time: {:%H:%M}\n", now);
}

打印容器

#include <vector>
#include <fmt/ranges.h>

int main() {
  std::vector<int> v = {1, 2, 3};
  fmt::print("{}\n", v);
}

编译时检查格式字符串

std::string s = fmt::format("{:d}", "I am not a number");

单线程写文件

#include <fmt/os.h>

int main() {
  auto out = fmt::output_file("guide.txt");
  out.print("Don't {}", "Panic");
}

彩色和样式文本打印

#include <fmt/color.h>

int main() {
  fmt::print(fg(fmt::color::crimson) | fmt::emphasis::bold,
             "Hello, {}!\n", "world");
  fmt::print(fg(fmt::color::floral_white) | bg(fmt::color::slate_gray) |
             fmt::emphasis::underline, "Olá, {}!\n", "Mundo");
  fmt::print(fg(fmt::color::steel_blue) | fmt::emphasis::italic,
             "你好{}!\n", "世界");
}

性能测试

{fmt} 在性能测试中表现出色,比

printf

快约20%,比

std::ostringstream

sprintf

快20-30倍。在编译时间和代码体积方面,{fmt} 也表现优异,与

printf

相当。

总结

{fmt} 是一个功能强大、性能卓越的C++格式化库,适用于各种高性能、高安全性的应用场景。无论你是开发嵌入式系统、跨平台应用,还是进行科学计算,{fmt} 都能为你提供高效、安全的格式化解决方案。快来尝试吧!

fmt A modern formatting library 项目地址: https://gitcode.com/gh_mirrors/fm/fmt

标签:

本文转载自: https://blog.csdn.net/gitblog_00089/article/details/142811485
版权归原作者 宋韵庚 所有, 如有侵权,请联系我们删除。

“{fmt}:高效、安全的C++格式化库”的评论:

还没有评论