Nun, lassen Sie uns zuerst einige Ihrer Annahmen demolieren:
- Einer der Vorteile von Nur-Header-Bibliotheken für C ++ besteht darin, dass sie nicht separat kompiliert werden müssen.
Wenn Sie Dinge separat kompilieren, müssen Sie möglicherweise nicht alles neu kompilieren, wenn sich nur ein Teil ändert.
Also ein Nachteil statt eines Vorteils.
- In C und C ++ macht Inline nur Sinn, wenn die Funktion in einer Header-Datei * definiert ist.
Ja, der einzige Effekt inline
ist die Ausnahme von der Ein-Definition-Regel .
Wehe dir, wenn diese Definitionen in irgendeiner Weise unterschiedlich sind.
Wenn also eine Funktion in einer Kompilierungseinheit enthalten ist, markieren Sie sie static
. Dies erhöht auch die Wahrscheinlichkeit von Inlining, da die Funktion verfügbar sein muss, um es zu inlineen.
Schauen Sie sich dennoch die Link-Time-Optimierung an, die mindestens von MSVC ++, gcc und clang unterstützt wird.
- Traditionell wurde in C das Layout .c / .h verwendet, wobei der Header die minimale öffentliche Schnittstelle der Übersetzungseinheit darstellt. Ebenso .cpp / hpp.
Nun, nur die minimale Oberfläche zu präsentieren, ist sicherlich eines der Ziele, eine höhere API- und ABI-Stabilität zu erreichen und die Kompilierungszeiten zu minimieren.
Insbesondere C ++ - Klassen sind jedoch nicht wirklich darauf ausgerichtet, da alle privaten Bits in den Header gelangen, ebenso wie die geschützten, ob Sie davon abgeleitet werden möchten oder nicht.
Das Entwurfsmuster PIMPL dient zum Reduzieren solcher Details.
Der Teil, bei dem die Trennung von Schnittstelle und Implementierung in C ++ völlig fehlschlägt, sind jedoch Vorlagen.
Das Komitee hat versucht, etwas mit exportierten Vorlagen zu tun , aber das wurde als zu kompliziert und nicht wirklich funktionierend aufgegeben.
Jetzt arbeiten sie an einem richtigen Modulsystem , obwohl es nur langsam geht. Das verkürzt die Kompilierungszeiten erheblich und sollte auch die API- und ABI-Stabilität erhöhen, indem die Oberfläche verringert wird.
Sind reine Header-Bibliotheken im Allgemeinen in Bezug auf Code und Ausführungszeit effizienter als das herkömmliche Layout? Wenn ja, liegt dies an umfangreichen Inlining- oder anderen Optimierungen?
Nur-Header-Bibliotheken können effizienter in Bezug auf Codegröße und Ausführungszeit sein. Dies hängt jedoch davon ab, ob die Bibliothek gemeinsam genutzt wird, wie viel davon verwendet wird, auf welche Weise und ob Inlining in diesem speziellen Fall einen entscheidenden Gewinn darstellt.
Und der Grund, warum Inlining für die Optimierung so wichtig ist, ist nicht, dass Inlining selbst einen so großen Schub darstellt, sondern dass es sich aufgrund der Möglichkeiten zur ständigen Weitergabe und weiteren Optimierung öffnet.