fmt/doc/index.md
2024-06-02 20:46:16 -07:00

8.6 KiB

hide
navigation
toc

A modern formatting library

Safety

Inspired by the Python's formatting facility, {fmt} provides a safe replacement for the printf family of functions. Errors in format strings, which are a common source of vulnerabilities in C, are reported at compile time. For example:

fmt::format("The answer is {:d}", "forty-two");

will give a compile-time error because d is not a valid format specifier for strings. APIs like fmt::format prevent buffer overflow errors via automatic memory management.

→ Learn more

Extensibility

Formatting of most standard types including all containers, dates and times is supported out-of-the-box. For example:

fmt::print("{}", std::vector{1, 2, 3});

prints the vector in a JSON-like format:

[1, 2, 3]

You can make your own types formattable and even make compile-time checks work for them.

→ Learn more

Performance

{fmt} can be anywhere from tens of percent to 20-30 times faster than iostreams and sprintf, especially on numeric formatting.

double to string02505007501,0001,2501,500ostringstreamostrstreamsprintfdoubleconvfmtTime (ns), smaller is better

The library minimizes dynamic memory allocations and allows format string compilation.

Unicode support

{fmt} provides portable Unicode support on major operating systems with UTF-8 and normal char strings. For example:

fmt::print("Слава Україні!");

will be printed correctly on Linux, macOS and even Windows console regardless of the codepages.

The default is locale-independent but you can opt into localized formatting and {fmt} makes it work with Unicode, working around problems in the standard libary.

Fast compilation

The library makes extensive use of type erasure to achieve fast compilation. fmt/base.h provides a subset of the API with minimal include dependencies and enough functionality to replace all uses of *printf.

Code using {fmt} is usually several times faster to compile than the equivalent iostreams code and while printf is faster still, the gap is narrowing.

→ Learn more

Small binary footprint

Type erasure is also used to prevent template bloat resulting in compact per-call binary code. For example, a call to fmt::print with a single argument is less than ten x86-64 instructions, comparable to printf despite adding runtime safety and much smaller than the equivalent iostreams code.

The library itself has small binary footprint and some components such as floating-point formatting can be disabled to make it even smaller for resource constrained devices.

Portability

{fmt} has a small self-contained codebase with the core consisting of just three header files and no external dependencies.

The library is highly portable and requires only on a minimal subset of C++11 features which are available in GCC 4.8, Clang 3.4, MSVC 19.0 (2015) and later. Newer compiler and standard library features are used if available and enable additional functionality.

Where possible, the output of formatting functions is consistent across platforms.

Open source

{fmt} is in top hundred open-source libraries on GitHub and has hundreds of all-time contributors.

Permissive MIT license allows using the library both in open-source and commercial projects.