2

「すべての」C++フォーマットライブラリが最終的に*sprintf数値をフォーマットする関数にフォールバックするかどうか疑問に思っています。

私はこれを求めています:

  • Visual C ++に付属しているiostreamsライブラリを見ると、ストリームに入力された数値は最終的にはでフォーマットされることがわかりますsprintf_s
  • Boost.Formatは、私が知る限り、利用可能なiostreamライブラリを使用します。
  • FastFormatは、最終的vsprintfに数値のフォーマットに使用します。

それで、 * sprintfを使用せ、フォーマット自体を行うiostreams実装はありますか?数値のフォーマットを*sprintfファミリーの関数に転送しない他のフォーマットライブラリはありますか?

次の形式で回答をいただければ幸いです。

  • いいえ:実装XYはABCを使用して数値をフォーマットします
  • はい:私が知っている他のすべての(たとえばiostreams)実装(X、Y、Z)も、数値フォーマットをstdioに転送します。

過度に投機的な回答は避けてください。

4

2 に答える 2

4

Boost Spiritは、コード( real.hppおよびint.hpp)およびintやdoubleなどのベンチマークからわかるように、*printfを使用しません。

ベンチマークは、BoostSpiritKarmaのジェネレーターをBoost.Formatに対してsprintfおよびstd::stringstreamに対してピットインします。gccコンパイラの場合のみ、sprintfのパフォーマンスはそのベンチマークに近づきます。そうでなければ、ブーストスピリットが明らかに勝者です。

ここに画像の説明を入力してください

于 2011-10-07T08:46:36.327 に答える
1

いいえ、たとえば、{fmt}ライブラリには、整数および浮動小数点形式の独自の実装があります。これは、の一般的な実装よりもはるかに高速ですsprintf。これらは、1つのプラットフォームでのダブルから文字列へのフォーマットベンチマーク( dtoa-benchmark )の結果です。

ベンチマーク結果

ご覧のとおり、{fmt}はsprintfここよりも約20倍高速です。

整数フォーマットも高速ですが、それほど劇的ではありません(LinuxおよびmacOSでは最大6〜7倍)。

ここに画像の説明を入力してください

免責事項:私は{fmt}の作者です。

于 2012-12-21T22:41:29.347 に答える