C ++格式库通常会回退到* sprintf进行数字格式化吗?

时间:2011-10-07 07:54:36

标签: c++ formatting string-formatting iostream fastformat

我想知道“所有”C ++格式化库是否最终会回退到*sprintf函数来格式化数字。

我问这个是因为:

  • 查看Visual C ++附带的iostreams库,我可以看到输入到流中的数字最终将使用sprintf_s进行格式化。
  • 就我所知,Boost.Format只使用可用的iostreams库。
  • FastFormat最终使用vsprintf格式化数字。

那么,是否存在使用* sprintf的iostreams实现并自行进行格式化?是否有其他格式库可以将数字格式转发到* sprintf函数系列?

我希望得到以下形式的答案:

  • 否:实施XY使用ABC格式化数字
  • 是的:我知道的所有其他(例如iostreams)实现(X,Y,Z)也将数字格式转发给stdio,因为......

请避免过度推测的答案。

2 个答案:

答案 0 :(得分:4)

Boost Spirit不使用* printf,从代码(real.hppint.hpp)和基准测试中可以看出整数和双打。

基准测试将Boost Spirit Karma的生成器与针对sprintf和std :: stringstream的Boost.Format进行对比。仅对于gcc编译器而言,sprintf的性能接近于该基准测试。否则,提升精神是明显的赢家。

enter image description here

答案 1 :(得分:1)

不,至少this formatting library有自己的整数格式实现。它仅将snprintf用于浮点数,但计划使用double-conversion以获得更好的性能。目前,根据this benchmark,该库的性能接近于printf的性能。我写了this blog post来解释如何在不牺牲类型安全的情况下实现这一点。

请注意,Boost Karma的基准测试有点误导,因为他们将printf之类的格式与dtoa之类的双字符串转换进行比较。不同之处在于,前者使您可以更好地控制输出,并在运行时更多地处理格式规范。

免责声明:我是上述格式库的作者。