Библиотеки форматирования 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. Разница в том, что первый дает вам больший контроль над выводом и делает больше работы во время выполнения для обработки спецификации формата.
Отказ от ответственности: я автор упомянутой библиотеки форматирования.