Почему реализация std:: to_string создает буфер в 4 раза больше размера?
С++ 11 вводит std::to_string
, поэтому я рассмотрел одну реализацию: он вызывает 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); }
Ответы
Ответ 1
Максимальное число двоичных цифр N-десятичного значения - это значение ceil (N * log (10)/log (2)). Единичной десятичной цифре требуется бинарные цифры (3.32), то есть 4.
Для размеров 8 бит это:
Decimals = ceil(8 * Size / 3.32) = ceil(2.41 * Size).
Для знака (накладные расходы и распределение) вы получаете:
Decimals = 4 * Size.
Примечание. Преобразование с snprintf одного подписанного char требует 5 байтов (включая знак и завершающий нуль). Для значений с размером более одного байта Decimals = 4 * Size
дает результат, который достаточно велик.