Подтвердить что ты не робот

Почему реализация 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); }
4b9b3361

Ответ 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 дает результат, который достаточно велик.