Что ж, давайте сначала опровергнем некоторые из ваших предположений:
- Одним из преимуществ библиотек только для заголовков для C ++ является то, что их не нужно компилировать отдельно.
Компиляция вещей по отдельности означает, что потенциально не нужно перекомпилировать все, если изменяется только часть.
Итак, недостаток вместо преимущества.
- В C и C ++ inline имеет смысл, только если функция определена в заголовочном файле *.
Да, единственный inline
оставшийся эффект - это исключение из правила одного определения .
Горе вам, если эти определения в любом случае отличаются.
Итак, если функция является внутренней по отношению к модулю компиляции, отметьте ее static
. Это также делает встраивание более вероятным, так как функция должна быть доступна для его встраивания.
Тем не менее, взгляните на оптимизацию времени соединения, поддерживаемую по крайней мере MSVC ++, gcc и clang.
- Традиционно в C использовался макет .c / .h, где заголовок представляет минимальный открытый интерфейс модуля перевода. Точно так же .cpp / hpp.
Что ж, только представление минимального интерфейса, безусловно, является одной из целей - добиться более высокой стабильности API и ABI и минимизировать время компиляции.
Тем не менее, классы C ++ на самом деле не приспособлены к этому, поскольку все частные биты просачиваются в заголовок, как и защищенные, независимо от того, хотите ли вы получить их из этого или нет.
Дизайн-шаблон PIMPL предназначен для уменьшения таких деталей.
Часть, где разделение интерфейса и реализации полностью терпит неудачу в C ++, является шаблонами.
Комитет пытался сделать что-то с экспортированными шаблонами , но это было заброшено как слишком сложное и не очень работающее.
Теперь они работают над правильной модульной системой , хотя она идет медленно. Это значительно сокращает время компиляции, а также должно повысить стабильность API и ABI за счет уменьшения их поверхности.
Являются ли библиотеки, использующие только заголовки, как правило, более эффективными с точки зрения кода и времени выполнения, чем традиционная схема? Если так, это из-за обширного встраивания или других оптимизаций?
Библиотеки только для заголовков могут быть более эффективными с точки зрения размера кода и времени выполнения, хотя это зависит от того, используется ли библиотека совместно, насколько она используется, как и каким образом, и является ли встраивание решающим преимуществом в этом конкретном случае.
И причина, по которой встраивание так важно для оптимизации, не в том, что встраивание само по себе является таким мощным стимулом, а из-за возможностей постоянного распространения и дальнейшей оптимизации, которые он открывает.