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