Bene, prima demoliamo alcuni dei tuoi presupposti:
- Uno dei vantaggi delle librerie solo intestazione per C ++ è che non devono essere compilate separatamente.
Compilare le cose separatamente significa potenzialmente non dover ricompilare tutto se cambia solo una parte.
Quindi, uno svantaggio anziché un vantaggio.
- In C e C ++ inline ha senso solo se la funzione è definita in un file di intestazione *.
Sì, l'unico effetto inlinerimasto è l'eccezione alla regola a una definizione .
Guai a te se quelle definizioni sono comunque diverse in ogni modo.
Quindi, se una funzione è interna a un'unità di compilazione, contrassegnarla static. Ciò rende anche più probabile l'allineamento, poiché la funzione deve essere disponibile per incorporarla.
Tuttavia, dai un'occhiata all'ottimizzazione del tempo di collegamento, come supportato da almeno MSVC ++, gcc e clang.
- Tradizionalmente, in C, è stato utilizzato il layout .c / .h, dove l'intestazione rappresenta l'interfaccia pubblica minima dell'unità di traduzione. Allo stesso modo, .cpp / hpp.
Bene, presentare solo l'interfaccia minima è certamente uno degli obiettivi, per ottenere una maggiore stabilità API e ABI e ridurre al minimo i tempi di compilazione.
Soprattutto le classi C ++ non sono realmente orientate a questo, poiché tutti i bit privati penetrano nell'intestazione, così come quelli protetti, indipendentemente dal fatto che tu voglia derivarne o meno.
Il modello di progettazione PIMPL serve a ridurre tali dettagli.
La parte in cui la separazione dell'interfaccia e l'implementazione falliscono completamente in C ++ sono i modelli.
Il comitato ha provato a fare qualcosa con i modelli esportati , ma questo è stato abbandonato perché troppo complicato e non funzionante.
Ora stanno lavorando su un sistema di moduli adeguato , anche se è lento. Ciò riduce notevolmente i tempi di compilazione e dovrebbe anche aumentare la stabilità API e ABI diminuendo la loro superficie.
Le librerie di sola intestazione sono generalmente più efficienti in termini di codice e tempo di esecuzione rispetto al layout tradizionale? Se è così, è a causa di approfonditi inline o altre ottimizzazioni?
Le librerie solo intestazione possono essere più efficienti in termini di dimensioni del codice e tempi di esecuzione, anche se ciò dipende dal fatto che la libreria sia condivisa, da quanto ne viene utilizzata, in quali modi e se l'inline dimostra una vittoria decisiva in quel caso specifico.
E il motivo per cui l'allineamento è così importante per l'ottimizzazione non è perché l'allineamento in sé stesso è un grande impulso, ma a causa delle opportunità di propagazione costante e di ulteriore ottimizzazione si apre.