Pull to refresh

Comments 17

Иронично, в статье про форматирование текста куски кода вообще не отформатированы, из-за чего практически нечитаемы (молчу про горизонтальную прокрутку).

А можно все тоже самое, но действительно с форматированием?

Ну, например, когда нужно вывести легко читаемую табличку типа

============ VPN ============ 
Count          : 131184     

Fill                        
Average File   :    10.542871  
Average Idx    :     4.629779   
Minimum File   :     7.000000   
Minimum Idx    :     0.000000    
Maximum File   :   783.000000 
Maximum Idx    :  2584.000000
SQE File       :     5.472801   
SQE Idx        :    20.577609  
Dispersion File:    29.951783  
Dispersion Idx :   423.441226 

Search                      
Average File   :     7.602459  
Average Idx    :     3.674952  
Minimum File   :     0.000000   
Minimum Idx    :     0.000000   
Maximum File   :   135.000000
Maximum Idx    :   128.000000
SQE File       :     2.360294  
SQE Idx        :     4.086529  
Dispersion File:     5.571032  
Dispersion Idx :    16.699851

Т.е. дополнение нулями, выравнивание по десятичному разделителю и т.п.
Насколько для таких операций fmt будет лучше/хуже printf? Возможно ли такое через потоки?

Без иронии, сарказма и подвоха. Действительно интересно.

Спасибо. Давно не работал с подобными вещами на С++. Потому и интересно чего такое стоить будет.

Учитывая что там статичный текст форматируют я думаю там над нормальным кодом автор особо не задумывался, не говоря уже про вывод нормальных результатов.

UFO just landed and posted this here

По-моему чисто с точки зрения чтения идея форматировать операцией двоичного сдвига чудовищная.

Интересно было бы ещё сравнить форматирование с Qt, понятно что это уже сторонняя либа, но всё же.

Это там где "%1 %2 %3 %1" % (1,2,3)? Так оно ж супер неудобное. Скорость будет на уровне printf, только памяти в некоторых случаях будет тратить несколько больше.

Да, но не только. Там ещё есть

  • asprintf

  • vasprintf

  • QTextStream

  • ну и arg

Вполне возможно, что это просто обёртки над std со своими доработками. Но вот это как раз и было бы интересно проверить, на сколько медленнее (быстрее) по сравнению с std

asprintf и vasprintf платформозависимые функции из Си, не С++.

QTextStream в целом по поведению похожа на стандартные стримы, врядли там будет что-то особенное, разве что от тонкой настройки что-то меняется, но тут уже экспоненциальный взрыв вариативности.

Итоговый текст будет иметь вид "address=00000004D4DAE218". Но с std::format этот вариант не сработает

Чтобы сработало, нужно привести аргумент к void* (если я не общаюсь с std, это точно работает с библиотекой fmt):

int a = 42;

std::string text = std::format("address={}", static_cast<void*>(&a));

Попытка проделать то же самое с помощью std::format снова провалится, поскольку эта команда не знает, как форматировать массив:

Автор точно переводчик? Это правильно переводится как «потерпит неудачу».

format вообще на питоновский способ форматирования похож. Не могу сказать о преимуществах объектного подхода. По мне так старый сишный способ вполне себе является рабочим. Вообще С++ изменился по сравнению с тем, что был первым вариантом от Бъёрна Страуструпа. Сейчас это вообще джунгли. Лично у меня последние новации не вызывают восторга. Получается, что это не старый добрый С++, а какой-то JavaScript.

Старый-добрый это про стандарт 98-го? А вы шутник!

Спасибо, интересно! Однако, предлагаю не обижать std::format_to в сравнении с sprintf: для sprintf буфер аллоцируется заранее, и с той же возможностью преаллоцировать буфер имеет смысл и std::format_to померять тоже. Я из любопытства померял - плюс добавил строчку на 10 миллионов итераций - получается примерно так (новая колонка с преаллоцированным буфером для std::format_to - предпоследняя):

iterations stringstream sprintf format_to fmt_to(2) format

1 14.50 3.20 4.60 0.30 0.40
2 2.55 0.50 0.50 0.30 0.30
5 1.66 0.34 0.30 0.22 0.28
10 1.16 0.26 0.24 0.19 0.21
100 0.86 0.21 0.19 0.16 0.19
1000 0.82 0.20 0.17 0.15 0.18
10000 0.77 0.19 0.16 0.14 0.17
100000 0.74 0.17 0.14 0.13 0.15
1000000 0.77 0.18 0.17 0.14 0.18
10000000 0.74 0.17 0.14 0.13 0.16

Извините за поехавшее форматирование - не знаю, как это можно здесь исправить. Мерял с компилятором msvc, Release, все оптимизации - на скорость.

Код для новой колонки - как для sprintf:

std::string str(100, '\0');
std::format_to(str.data(), "Number {} is great!", numbers[i]);

Sign up to leave a comment.