#windows #printf
#Windows #printf
Вопрос:
Я хотел бы определить свои собственные преобразования выходных данных printf:
printf("%T", widget);
Для gcc я могу использовать, printf.h
как показано здесь.
Как я могу это сделать для Windows (Visual Studio)?
Комментарии:
1. Насколько я знаю, только glibc предоставляет подобную функцию, и в Windows нет эквивалента.
Ответ №1:
Вместо того, чтобы разрешать printf
выполнять преобразования, предоставьте вашему объекту функцию, которая преобразует в строку и позволяет printf
выводить строку как обычно.
Ответ №2:
Это «плохая идея» ™ — это намного, намного проще. более разумно, более переносимо и более обслуживаемо написать обычную функцию для выполнения преобразования. Например (при условии, что виджет имеет идентификатор и имя):
void PrintWidget( Widget * w ) {
printf( "widget id %d name %s " , w->id, w->name );
}
Комментарии:
1. Я знаю, что обычно это плохая идея. В настоящее время мы используем более разумный, переносимый и поддерживаемый метод, но это снижает производительность. Копирование указателя на виджет дешевле, чем копирование строкового представления виджета. (Основной поток копирует данные в буфер печати, который используется отдельным потоком ведения журнала, который записывает данные на диск). Наши измерения показывают, что мы можем сэкономить в среднем около 1 микросекунды на вызов, что было бы огромным.
2. @David printf() сама по себе обычно довольно неэффективна (потому что ей приходится анализировать строку формата при каждом вызове) — вероятно, вам лучше записывать непосредственно в поток через функцию, которая записывает непосредственно в выходной поток (не в буфер). И если используемый вами компилятор Windows не имеет этой функции (чего нет в vc ) Я не вижу, как вы провели сравнительный анализ.
3. Наше приложение является многопоточным, поэтому нам требуется запись в общий буфер. Что касается Windows: мы не запускаем в ней наш производственный код, но некоторым разработчикам нравится разрабатывать на ней, поэтому мы стараемся поддерживать совместимость. Наш бенчмаркинг был выполнен в Linux.
4. @David Что ж, заставьте их использовать порт Windows MinGW GCC (получите его по адресу tdragon.net/recentgcc ), который, я полагаю, будет поддерживать пользовательские форматы. Но если серьезно, я думаю, что вы поднимаете неправильное дерево здесь — printf не обладает какими-либо волшебными возможностями повышения производительности, которые вы не можете написать самостоятельно.
5. Кроме того, что касается производительности printf(), синтаксический анализ строки формата выполняется в отдельном потоке с низким приоритетом, который мы не стремимся оптимизировать. Мы хотим оптимизировать передачу данных из основного потока в поток с низким приоритетом.