Уже есть несколько вопросов, объясняющих, как преобразовать целое число в std::string в C++, например этот, но ни одно из предложенных решений не является эффективным.
Вот готовый к компиляции код для некоторых распространенных методов, с которыми можно конкурировать:
- «Путь C++», использование строкового потока: http://ideone.com/jh3Sa
- sprintf, который SO-специалисты обычно рекомендуют тем, кто заботится о производительности: http://ideone.com/82kwR
И мой собственный вклад, который конкурентоспособен на настольных компьютерах и демонстрирует подход, который работает на полной скорости и на встроенных системах, в отличие от алгоритмов, зависящих от целочисленного модуля:
- Алгоритмы Бена: http://ideone.com/SsEUW
Наконец, функция ltoa нестандартна, но широко доступна.
- Версия ltoa для всех, у кого есть компилятор, который ее предоставляет (в ideone ее нет): http://ideone.com/T5Wim
Правила для алгоритмы
- Предоставьте код для преобразования как минимум 32-битных целых чисел со знаком и без знака в десятичные.
- Создайте вывод в виде std::string.
- Нет приемов, несовместимых с потоками и сигналами (например, статические буферы).
- Вы можете использовать набор символов ASCII.
/> - Обязательно протестируйте свой код на INT_MIN на машине с двоичным дополнением, где абсолютное значение невозможно представить.
- В идеале вывод должен быть посимвольно идентичен канонической версии C++ с использованием stringstream, http://ideone.com/jh3Sa, но все, что ясно понятно, как правильное число, тоже подходит.
- НОВИНКА: Хотя для сравнения вы можете использовать любые параметры компилятора и оптимизатора (кроме полностью отключенных), код также должен компилироваться и давать правильные результаты как минимум под VC++ 2010 и g++.
Помимо лучших алгоритмов, я также хотел бы получить некоторые тесты на нескольких разных платформах и компиляторах (давайте использовать пропускную способность в МБ/с в качестве стандартной единицы измерения). Я считаю, что код моего алгоритма (я знаю, что тест sprintf требует некоторых сокращений - теперь исправлено) имеет четко определенное поведение по стандарту, по крайней мере, в предположении ASCII, но если вы видите какое-либо неопределенное поведение или входные данные, для которых выходные данные недействительны, укажите это.
Выводы:
Разные алгоритмы работают для g++ и VC2010, вероятно, из-за разных реализаций std::string на каждом. VC2010 явно лучше справляется с NRVO, избавление от возврата по значению помогло только в gcc.
Найден код, который превосходит sprintf на порядок. ostringstream отстает в 50 и более раз.
Победителем конкурса стал пользователь user434507, создавший код, который выполняет на gcc скорость, равную 350 % моей собственной. Дальнейшие записи закрыты по прихоти сообщества SO.
Текущими (окончательными?) чемпионами по скорости являются:
- Для gcc: Юджин Смит, в 8 раз быстрее, чем sprintf: http://ideone.com/0uhhX
- Для Visual C++: Тимо, в 15 раз быстрее, чем sprintf: http://ideone.com/VpKO3
Подробнее здесь: https://stackoverflow.com/questions/435 ... conversion
Мобильная версия