2016-08-31 9 views
31

C++ 11ではstd::to_stringが導入されています。そのため、実装では、vsnprintfを内部的に呼び出しています。さて、なぜサイズのパラメータを型のサイズの4倍に設定するのですか?なぜstd :: to_stringの実装は、型のサイズの4倍のバッファを作成するのですか?

inline string 
to_string(int __val) 
{ return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(int), 
              "%d", __val); } 

inline string 
to_string(unsigned __val) 
{ return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 
              4 * sizeof(unsigned), 
              "%u", __val); } 

inline string 
to_string(long __val) 
{ return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(long), 
              "%ld", __val); } 
+0

これは、intのすべてのサイズ(1以上)に対して、文字列と末尾のゼロを収容するのに十分な大きさのバッファを作成します。 –

+8

無料レビュー:彼らは本当に私の意見で 'sizeof __val'を使用していたはずです。 – unwind

答えて

42

N-小数点値のバイナリ桁の最大数は(N *ログ(10)/ログ(2))のCEIL値です。 1桁の10進数は、それはそれは8ビットのサイズ4.

で、はceil(3.32)進数を必要とします:

Decimals = ceil(8 * Size/3.32) = ceil(2.41 * Size). 

記号(オーバーヘッドと割り当て)のために、あなたが得る:

Decimals = 4 * Size. 

注:単一の符号付き文字のsnprintfでの変換には、5バイト(符号と終了ゼロを含む)が必要です。 1バイトより大きい値の場合は、Decimals = 4 * Sizeが結果を提供しますが、これは十分です。

+0

好奇心のために、どうやってこの方程式を見つけましたか? – Garf365

+2

@ Garf365これはベースの変更であり、その数はベース2(バイナリ)でエンコードされ、ベース10に書き込まれます。 – dkg

関連する問題