16

I just read about the FastFormat C++ i/o formatting library, and it seems too good to be true: Faster even than printf, typesafe, and with what I consider a pleasing interface:

// prints: "This formats the remaining arguments based on their order - in this case we put 1 before zero, followed by 1 again"
fastformat::fmt(std::cout, "This formats the remaining arguments based on their order - in this case we put {1} before {0}, followed by {1} again", "zero", 1);

// prints: "This writes each argument in the order, so first zero followed by 1"
fastformat::write(std::cout, "This writes each argument in the order, so first ", "zero", " followed by ", 1);

This looks almost too good to be true. Is there a catch? Have you had good, bad or indifferent experiences with it?

4

6 回答 6

6

FastFormat 有什么“陷阱”吗?

上次我检查时,有一个烦人的问题:

您只能使用库的窄字符串版本宽字符串版本。(wchar_t和的功能char相同——使用哪种类型是编译时开关。)

使用 iostreams、stdio 或 Boost.Format,您可以同时使用它们。

于 2011-10-07T09:24:15.377 回答
5

找到了一个“捕获”,尽管对于大多数人来说它永远不会显现出来。从项目页面:

原子操作。 它不会像 IOStreams 那样一次写出一个语句元素,因此没有原子性问题

我可以看到这种情况发生的唯一方法是,如果它本身缓冲整个write()调用的输出,然后将其写入ostream一步。这意味着它需要分配内存,如果传入write()调用的对象产生大量输出(几兆字节或更多),它可以在内部缓冲区中消耗多达两倍的内存(假设它使用增长缓冲区-通过将其大小每次加倍的技巧)。

如果您只是将它用于日志记录,而不是转储大量 XML,那么您将永远不会看到这个问题。

我看到的唯一其他“捕获”是:

高度便携。它适用于所有优秀的现代 C++ 编译器;它甚至适用于 Visual C++ 6!

因此它不适用于旧的 C++ 编译器,例如cfront,而iostreams向后兼容 80 年代后期。同样,如果有人对此有任何疑问,我会感到惊讶。

于 2009-12-14T16:56:23.707 回答
4

尽管 FastFormat 是一个很好的库,但它存在许多问题:

  • 有限的格式支持,特别是不支持以下功能:
    • 前导零(或任何其他非空格填充)
    • 八进制/十六进制编码
    • 运行时宽度/对齐规范
  • 该库对于相对较小的格式化任务来说相当大,并且具有更大的依赖性(STLSoft)。
于 2012-12-07T02:38:56.063 回答
2

它看起来确实很有趣!无论如何都是好的提示,为此+1!

我已经玩了一段时间了。我看到的主要缺点是 FastFormat 支持的输出格式选项较少。我认为这是实现更高类型安全性的直接结果,并且根据您的情况进行了很好的权衡。

于 2009-12-15T16:43:56.193 回答
0

如果您详细查看他的性能基准页面,您会注意到优秀的旧 Cprintf系列函数在 Linux 上仍然胜出。事实上,唯一表现不佳的测试用例是应该是静态字符串连接的测试用例,我认为printf这是浪费的。此外,GCC 提供了对 -style 函数调用的静态类型检查printf,因此减少了类型安全的好处。所以: 如果您在 Linux 上运行并且需要绝对最佳性能,FastFormat 可能不是最佳解决方案。

于 2009-01-15T14:25:05.750 回答
0

如docs中所述,该库依赖于几个环境变量。

这对某些人来说可能没什么大不了的,但我希望我的代码尽可能独立。如果我从源代码管理中检查它,它应该可以工作并编译。如果它需要您设置环境变量,它不会。

于 2010-05-20T12:26:17.383 回答