Bene, per prima cosa demoliamo alcune delle tue ipotesi:
- One of the advantages of header-only libraries for C++ is that they do not need to be compiled separately.
Compilare le cose separatamente significa potenzialmente non dover ricompilare tutto se cambia solo una parte.
Quindi, uno svantaggio invece di un vantaggio.
- In C and C++ inline makes sense only if the function is defined in a header file*.
Sì, l'unico effetto che% co_de ha lasciato è l'eccezione alla regola a una definizione .
Guai a voi se quelle definizioni sono in ogni caso diverse.
Quindi, se una funzione è interna a un'unità di compilazione, contrassegnala inline
. Ciò rende anche più probabile l'inlining, in quanto la funzione deve essere disponibile per poterla allineare.
Ancora, dai un'occhiata all'ottimizzazione del link-time, come supportato da almeno MSVC ++, gcc e clang.
- Traditionally, in C, .c/.h layout has been used, where the header represents the minimal public interface of the translation unit. Similarly, .cpp/hpp.
Beh, solo la presentazione dell'interfaccia minima è certamente uno degli obiettivi, per raggiungere una stabilità API e ABI più elevata e per ridurre al minimo i tempi di compilazione.
Soprattutto le classi C ++ non sono realmente orientate a questo, dato che tutti i bit privati perdono nell'intestazione, così come quelli protetti se vuoi derivarne o meno.
Il modello di progettazione PIMPL serve a ridurre tali dettagli.
La parte in cui l'interfaccia di separazione e l'implementazione falliscono completamente in C ++ sono comunque i modelli.
Il comitato ha cercato di fare qualcosa con modelli esportati , ma questo è stato abbandonato come troppo complicato e non funziona davvero.
Ora stanno lavorando su un adeguato sistema di moduli , anche se è lento. Ciò riduce drasticamente i tempi di compilazione e dovrebbe anche aumentare la stabilità dell'API e dell'ABI diminuendo la loro superficie.
Are header-only libraries generally more efficient code- and execution time wise than the traditional layout? If so, is this because of extensive inlining or other optimizations?
Le librerie di solo intestazioni possono essere più efficienti in termini di dimensioni del codice e tempi di esecuzione, sebbene ciò dipenda dal fatto che la libreria sia condivisa, da quanta ne viene utilizzata, in che modo e se l'inlining dimostra una vittoria decisiva in quel caso specifico.
E il motivo per cui l'inline è così importante per l'ottimizzazione non è perché l'inlining stesso è un così grande impulso, ma a causa delle opportunità di propagazione costante e dell'ulteriore ottimizzazione si apre.