Почему библиотека fmt не предназначена только для заголовков?

Я знаю, что можно использовать fmt библиотека форматирования в режиме только заголовков:

Как использовать библиотеку fmt в режиме только заголовка?

но - почему это не только заголовок, точка? То есть в чем преимущество использования его в режиме без заголовков?

3 ответа

Решение

Основная причина - скорость сборки, как уже правильно указали другие. Например, компиляция со статической библиотекой (по умолчанию) примерно в 2,75 раза быстрее, чем с библиотекой, содержащей только заголовок:

      #include <fmt/core.h>

int main() {
  fmt::print("The answer is {}.", 42);
}
      % time c++ -c test.cc -I include -std=c++11
c++ -c test.cc -I include -std=c++11  0.27s user 0.05s system 97% cpu 0.324 total

% time c++ -c test.cc -I include -std=c++11 -DFMT_HEADER_ONLY
c++ -c test.cc -I include -std=c++11 -DFMT_HEADER_ONLY  0.81s user 0.07s system 98% cpu 0.891 total

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

Какая польза от использования его в режиме без заголовков?

Я не автор, поэтому не могу говорить за них. Но я могу рассказать вам о преимуществах не только заголовков.

  • Позволяет заголовкам библиотеки не включать системные заголовки, которые обычно имеют проблемы, такие как определение макросов с именами, которые могут конфликтовать с пользовательской программой (например, windows.h, который может определять макросы, которые перекрываются с некоторыми стандартными функциями библиотеки). Libfmt действительно пользуется этой возможностью. Если я не ошибаюсь, функции, специфичные для ОС, опускаются в режиме только заголовков.
  • Не встроенные функции обычно позволяют намного быстрее выполнять перекомпоновку в случае изменения реализации. Это очень актуально для разработчика библиотеки, который, вероятно, часто этим занимается. Это может быть актуально для пользователя, если библиотека часто обновляется. Важность этого возрастает по мере роста библиотеки. Этим нельзя воспользоваться в случае неограниченного кода шаблона. Большинство из этих условий, вероятно, находятся на стороне «не очень актуальны или не могут быть использованы» для libfmt, вероятно, поэтому он, в первую очередь, предлагает возможность использования только заголовков.

Некоторые функции, такие как vformatне шаблоны. Нет смысла помещать их в заголовки и замедлять весь процесс компиляции. Я предполагаю, что это обоснование. В fmt Библиотека очень заботится о времени компиляции, насколько я могу судить.

Другие вопросы по тегам