web-dev-qa-db-ja.com

std :: to_stringを実装すると、型の4倍のサイズのバッファが作成されるのはなぜですか?

C++ 11ではstd::to_stringが導入されているため、1つの実装を確認しました。内部でvsnprintfを呼び出します。さて、なぜそれは常にサイズパラメータをタイプのサイズの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); }
31
xwl

N桁の値の2進数の最大数は、(N * log(10)/ log(2))のceil値です。 10進数の1桁には、ceil(3.32)の2進数、つまり4が必要です。

8ビットのサイズの場合:

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

サイン(オーバーヘッドと割り当て)については、次のようになります。

Decimals = 4 * Size.

注:単一のsigned charのsnprintfを使用した変換には、5バイト(符号と終了ゼロを含む)が必要です。サイズが1バイトを超える値の場合、Decimals = 4 * Sizeは、十分な大きさの結果を提供します。

42
user2249683