Использование libfmt с устаревшим API - PullRequest
1 голос
/ 03 августа 2020

Я хочу измерить производительность vsnprintf по сравнению с современной библиотекой форматирования, в частности libfmt, поверх устаревшего C API. Невозможно использовать C ++ непосредственно у вызывающего абонента. Как я могу это сделать?

const char *fmt, ...

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

Назначение - буфер с заданной максимальной длиной. Мы не можем использовать кучу ни для чего. Кучи нет.

Ответы [ 2 ]

3 голосов
/ 03 августа 2020

Существует очень фундаментальное различие между тем, как fmt работает по сравнению с printf. А именно, строки форматирования fmt не содержат информации о типе.

fmt основан на шаблонах c Variadi C ++. Ожидается, что информация о типе будет передаваться, как это типично для C ++: через механизмы времени компиляции . Таким образом, строки формата fmt не должны повторять информацию о типе, которую по сути содержат все функции форматирования. Эта строгая типизация позволяет fmt разрешать функции расширяемости на основе типов.

C переменные стирают всю информацию о типах. Без информации о типе, хранящейся в строке, невозможно восстановить информацию о типе, которой fmt требуется для выполнения своей работы.

Библиотека libfmt содержит тип dynamic_format_arg_store (это не является частью C ++ 20, но я думаю, что вы сможете его создать). Однако даже это требует, чтобы вы знали тип в точке, где вы сохраняете аргументы. Поскольку C вариационные числа уже стерли тип, вам не повезло.

Фундаментальные предположения о fmt как библиотеке делают его несовместимым с C вариативным числом.

2 голосов
/ 03 августа 2020

{fmt} - это библиотека C ++, которая не предоставляет C API, поэтому вам нужно использовать компилятор C ++ или написать собственную C оболочку. Вы можете использовать dynamic_format_arg_store для построения списка аргументов в вашей оболочке, но это будет менее эффективно, чем использование C ++ API напрямую.

...