One of the advantages of header-only libraries for C++ is that they do not need to be compiled separately
Não, isso não é uma vantagem, muito pelo contrário - a parte principal da biblioteca tem que ser compilada sempre que incluída, não apenas uma vez. Isso normalmente aumentará os tempos de compilação. No entanto, se você está se referindo às vantagens listadas aqui na Wikipedia : esse artigo está falando sobre a redução da sobrecarga administrativa em relação à todo o processo de construção, embalagem e implantação.
In C and C++ inline makes sense only if the function is defined in a header file*
Isso depende do sistema compilador / linker, mas acho que para a maioria dos compiladores C e C ++ existentes isso é verdade.
Traditionally, in C, .c/.h layout has been used, where the header represents the minimal public interface of the translation unit. Similarly, .cpp/hpp.
Isso está correto na maior parte. Os cabeçalhos de classe C ++ geralmente contêm mais do que a interface pública mínima - eles normalmente contêm também muitas coisas particulares. Para atenuar isso, coisas como o idioma PIMPL são usadas. Isso é algo como "o oposto" de uma biblioteca somente de cabeçalho, que tenta minimizar o conteúdo do cabeçalho necessário.
Mas, para responder à sua pergunta principal: isso é um compromisso. Quanto mais código de biblioteca se coloca nos arquivos de cabeçalho, mais o compilador tem uma chance para otimizar o código para velocidade (se isso realmente acontecer, ou se o aumento for notável, é uma questão completamente diferente) . Por outro lado, código excessivo nos cabeçalhos aumenta o tempo de compilação. Especialmente em grandes projetos em C ++, isso pode se tornar um problema sério, veja "Design de Software em Cálculo em Grande Escala", de John Lakos - Embora o livro esteja um pouco desatualizado e alguns dos problemas descritos nele sejam abordados por compiladores modernos, as idéias / soluções gerais ainda são válidas.
Em particular, quando você não está usando uma biblioteca estável (de terceiros), mas você está desenvolvendo suas próprias bibliotecas durante o seu projeto, os tempos de compilação se tornam aparentes. Toda vez que você mudar alguma coisa na lib, você deve alterar um arquivo de cabeçalho, o que causará uma recompilação e uma ligação de todas as unidades dependentes.
IMHO a popularidade das bibliotecas somente de cabeçalho é causada pela popularidade da metaprogramação de modelos. Para a maioria dos compiladores, as bibliotecas templated devem ser somente cabeçalho porque o compilador só pode iniciar o processo de compilação principal quando os parâmetros de tipo são fornecidos, e para compilação e otimização completa o compilador deve ver "both at once" - o código da biblioteca mais os valores dos parâmetros do modelo. Isso torna impossível (ou pelo menos difícil) produzir quaisquer unidades de compilação "pré-compiladas" para essa biblioteca.