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

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

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

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 07 октября 2011

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

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

enter image description here

1 голос
/ 22 декабря 2012

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

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

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

...