Ich habe eine .cpp
Datei, die einige statische freie Funktionen hat. Ich weiß, wie das in einer Header-Datei helfen würde, aber da die cpp nirgendwo enthalten ist, was ist der Punkt? Gibt es Vorteile?
Das Deklarieren von freien Funktionen als static
gibt ihnen eine interne Verknüpfung, die dem Compiler aggressivere Optimierungen ermöglicht, da nun garantiert ist, dass niemand außerhalb der TU diese Funktion sehen kann. Zum Beispiel kann die Funktion vollständig aus der Assembly verschwinden und überall inline werden, da keine verknüpfbare Version bereitgestellt werden muss.
Beachten Sie, dass dies auch die Semantik etwas ändert, da Sie unterschiedliche statische Funktionen mit demselben Namen in verschiedenen TUs haben dürfen, während mehrere Definitionen von nicht statischen Funktionen einen Fehler darstellen.
Da Kommentarboxen zu klein sind, um zu erklären, warum Sie einen schwerwiegenden Fehler in Ihrer Argumentation haben, stelle ich dies als eine Community-Wiki-Antwort dar. Für Header-only-Funktionen ist static
ziemlich nutzlos, da jeder, der seinen Header enthält, eine andere Funktion erhält. Das bedeutet, dass Sie Code kopieren, den der Compiler für jede der Funktionen erstellt (es sei denn, der Linker kann den Code zusammenführen, aber nach allem, was ich weiß, ist das sehr unwahrscheinlich), und schlimmer noch, wenn die Funktion lokale Statik hätte unterschiedlich sein, was möglicherweise mehrere Initialisierungen für jeden Aufruf einer Definition aus einer anderen Inklusion zur Folge hat. Nicht gut.
Was Sie für Header-only-Funktionen benötigen, ist inline
(nicht static
inline
), was bedeutet, dass jede Header-Inklusion die gleiche Funktion definiert und moderne Linker den Code jeder Definition nicht duplizieren können done for static
(in vielen Fällen verlangt der C ++ Standard dies sogar), aber es wird nur eine Kopie des Codes aus allen Definitionen ausgegeben, die von allen Einschlüssen erzeugt wurden.
Ein bisschen Out-of-Order-Antwort, weil der erste Punkt angesprochen einige Fragen in meinem Kopf aufwirft.
aber da die cpp nicht irgendwo enthalten ist
Ich hoffe sehr, dass du nie irgendwo eine Quelldatei #include
findest. Der Präprozessor kümmert sich nicht um die Unterscheidung zwischen Quelle und Header. Diese Unterscheidung existiert größtenteils, um den Menschen zu nutzen, nicht den Compilern. Es gibt viele Gründe, warum Sie niemals #include
eine Quelldatei irgendwo verwenden sollten.
Ich habe eine CPP-Datei, die einige statische freie Funktionen hat. Ich weiß, wie das in einer Headerdatei helfen würde ...
Wie würde das helfen?
Sie deklarieren nicht statische freie Funktionen in einem Header, wenn diese freien Funktionen extern verknüpft sind. Das Deklarieren (aber nicht Definieren) von statischen freien Funktionen in einem Header hilft nicht. Es ist ein Hindernis. Sie möchten Dinge in eine Kopfzeile einfügen, die Ihnen und anderen Programmierern hilft, den exportierten Inhalt von etwas zu verstehen. Diese statischen freien Funktionen werden nicht exportiert. Sie können freie Funktionen in einer Kopfzeile definieren und sie somit zum exportierten Inhalt machen, aber standardmäßig wird das Schlüsselwort inline
anstelle von static
verwendet.
Was Ihre statischen freien Funktionen in Ihrer Quelldatei anbelangt, sollten Sie in Betracht ziehen, die Deklarationen dieser Funktionen in der Nähe der Quelldatei (aber nicht in einer Kopfzeile) zu platzieren. Dies kann zur Verbesserung der Verständlichkeit beitragen. Ohne diese Deklarationen sieht die Organisation der Quelldatei Pascalish aus, wobei die Low-Level-Funktionen zuerst definiert werden. Die meisten Leute mögen eine Top-Down-Präsentation. Indem Sie zuerst die Funktionen deklarieren, können Sie eine Top-Down-Strategie anwenden. Oder eine Inside-Out-Strategie oder eine Strategie, die die Funktionalität am leichtesten verständlich macht.
Tags und Links c++