Библиотеки форматирования C++ обычно используют *sprintf для числового форматирования?

Мне интересно, все ли библиотеки форматирования C++ в конце концов возвращаются к *sprintf функция для форматирования чисел.

Я спрашиваю об этом, потому что:

  • Глядя на библиотеку iostreams, которая поставляется с Visual C++, я вижу, что числа, введенные в поток, в конечном итоге будут отформатированы с sprintf_s,
  • Насколько я могу судить, Boost.Format просто использует доступную библиотеку iostreams.
  • FastFormat в конечном итоге использует vsprintf отформатировать число.

Итак, есть ли реализации iostreams, которые не используют *sprintf и сами форматируют? Существуют ли другие библиотеки форматирования, которые не пересылают форматирование чисел в семейство функций *sprintf?

Буду признателен за ответы в виде:

  • Нет: реализация XY использует ABC для форматирования чисел
  • Да: все другие известные мне реализации (например, iostreams) (X, Y, Z) также пересылают форматирование чисел в stdio, потому что...

Пожалуйста, избегайте чрезмерно умозрительных ответов.

2 ответа

Решение

Boost Spirit не использует *printf, как видно из кода ( real.hpp и int.hpp) и тестов, например, для int и double.

Этот тест сравнивает генераторы Boost Spirit Кармы с Boost.Format с sprintf и std::stringstream. Только для компиляторов gcc производительность sprintf приближается в этом тесте. Иначе, Boost Spirit - явный победитель.

Нет, по крайней мере, эта библиотека форматирования имеет собственную реализацию целочисленного форматирования. Оно использует snprintf только для чисел с плавающей точкой, но есть планы использовать двойное преобразование для лучшей производительности. В настоящее время производительность этой библиотеки близка к производительности printf в соответствии с этим тестом. Я написал этот пост в блоге, объясняющий, как это было возможно без ущерба для безопасности типов.

Обратите внимание, что тесты Boost Karma немного вводят в заблуждение, потому что они сравнивают форматирование как printf в двойное преобразование строки как dtoa. Разница в том, что первый дает вам больший контроль над выводом и делает больше работы во время выполнения для обработки спецификации формата.

Отказ от ответственности: я автор упомянутой библиотеки форматирования.

Другие вопросы по тегам