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 inline
rimasto è 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.