Bem, primeiro vamos demolir algumas de suas suposições:
- Uma das vantagens das bibliotecas somente de cabeçalho para C ++ é que elas não precisam ser compiladas separadamente.
Compilar as coisas separadamente significa potencialmente não ter que recompilar tudo se apenas uma parte mudar.
Portanto, uma desvantagem em vez de uma vantagem.
- Em C e C ++, o inline faz sentido apenas se a função estiver definida em um arquivo de cabeçalho *.
Sim, o único efeito inline
que resta é a exceção à regra de definição única .
Ai de você, se essas definições são diferentes de alguma forma.
Portanto, se uma função é interna a uma unidade de compilação, marque-a static
. Isso também torna o inlining mais provável, pois a função precisa estar disponível para incorporá-lo.
Ainda assim, dê uma olhada na otimização do tempo do link, conforme suportado pelo menos MSVC ++, gcc e clang.
- Tradicionalmente, em C, o layout .c / .h é usado, onde o cabeçalho representa a interface pública mínima da unidade de tradução. Da mesma forma, .cpp / hpp.
Bem, apenas apresentar a interface mínima é certamente um dos objetivos, obter maior estabilidade da API e ABI e minimizar o tempo de compilação.
Especialmente, as classes C ++ não são realmente voltadas para isso, pois todos os bits privados vazam para o cabeçalho, assim como os protegidos, quer você queira derivar ou não.
O padrão de design PIMPL é para reduzir esses detalhes.
A parte em que a separação da interface e da implementação falha completamente no C ++ é nos modelos.
O comitê tentou fazer algo com modelos exportados , mas isso foi abandonado por ser muito complicado e realmente não funcionar.
Agora, eles estão trabalhando em um sistema de módulos adequado , embora o processo seja lento. Isso reduz severamente o tempo de compilação e também deve aumentar a estabilidade da API e da ABI, diminuindo sua superfície.
As bibliotecas somente de cabeçalho geralmente são mais eficientes em termos de código e tempo de execução do que o layout tradicional? Em caso afirmativo, isso ocorre por causa de extensas inlining ou outras otimizações?
As bibliotecas apenas de cabeçalho podem ser mais eficientes no tamanho do código e no tempo de execução, embora isso dependa se a biblioteca é compartilhada, quanto dela é usada, de que maneira e se o inlining prova uma vitória decisiva nesse caso específico.
E o motivo pelo qual inlining é tão importante para a otimização não é porque o inlining é um grande impulso, mas devido às oportunidades de propagação constante e maior otimização que ele abre.