Frage zur Kompilierung (cpp und h)



  • Hey Leute,

    ich habe als Beispiel eine cpp-Datei mit einem Einhängepunkt und eine weitere cpp-Datei mit einer Klasse, die nur statische inline Funktionen beinhaltet. Die cpp-Datei mit der Klasse ist in der cpp-Datei mit dem Einhängepunkt includiert. Sehe ich es richtig, das nun die Klasse zweimal kompiliert wird? Einmal allein in der cpp-Datei, was total sinnlos ist, oder? Und einmal durch das include, wodurch die Klasse über den Code aus der cpp-Datei mit dem Einhängepunkt gesetzt wird. Wenn ich nun die cpp-Datei mit der Klasse in eine h-Datei umbenenne, wird die Klasse nur noch einmal kompiliert und zwar in der cpp-Datei mit dem Einhängepunkt und so sollte es auch sein, oder?

    P.S.: Bitte ignoriert hier einmal, das Klassen in .h und .cpp Dateien aufgesplittet werden sollten.

    Mit freundlichen Grüßen,
    DarkBug



  • so ganz habe ich jetzt nicht verstanden, was du wo inkludierst. Aber generell gilt: keine cpp-Dateien inkludieren.



  • cpp-Dateien per include einbinden, ist eine ganz schlechte Idee. Das müsste eigentlich einen Linker-Fehler wegen doppelter Definition geben, sofern die cpp-Datei mit deiner Klasse deinem Projekt hinzugefügt ist und somit kompiliert wird. Packe sie lieber in einen Header und versehe diesen mit include guards (damit wird mehrfaches Einbinden verhindert). Optimalerweise teilst du auf h und cpp auf, ob du das nun hören willst, oder nicht. 😉



  • Leider versteht man nur schwer was du machst. Zum Beispiel ist der Begriff "Einhängepunkt" bestenfalls selten anzutreffen. Ich habe keinen Schimmer was du damit meinst. Mehr als Worte würde der Code uns sagen was Sache ist. (Siehe erster Link in meiner Signatur).



  • Ok, ich hatte einen kleinen Denkfehler bezüglich #include.

    Grundsätzlich gesagt geht es mir um die Kompilierungszeit. Als Beispiel habe ich mehrere Klassen, welche in h und cpp aufgeteilt sind. Die Header werden alle in Main.cpp inkludiert. Da die Header-Dateien sich nicht ändern, stört es mich ein wenig, das diese bei jedem Kompilierungsvorgang vor die Main.cpp gesetzt werden und somit mit neu kompiliert werden. Ich nehme aber an, das es unmöglich ist dies zu verhindern, da sonst die Main.cpp die benötigten Deklarationen nicht kennt, korrekt?

    @pumuckl: Mit dem Einhängepunkt meine ich z.B. bei Konsolenanwendungen die Main-Methode. Das hier ist mehr eine generelle Frage, einen Code gibt es nicht.





  • DarkBug schrieb:

    Die Header werden alle in Main.cpp inkludiert.

    Das heißt du hast eines der folgenden Dinge getan:

    • nur eine Handvoll Header eingebunden
    • tonnenweise Header eingebunden, deren Deklarationen du in der main benötigst
    • tonnenweise Header eingebunden, obwol du nur eine Handvoll der Deklarationen du in der main benötigst

    Letzteres ist einfach, binde nichts ein, was du nicht brauchst. Du brauchst auch weniger als du vermutlich denkst, google mal nach forward declaration.
    Das erste ist kein problem, wenn du deinen Compiler nicht grade auf irgendeinem uralt,Ding laufen lässt. Mit einer Handvoll Header solltest du keine merklichen Compilezeiten haben. Punkt zwei bedeutet, dass du deine main-Methode mit Code überfrachtet hast, dann solltest du ein wenig refactoring betreiben, um die Compilezeit-Abhängigkeiten zu verringern.

    Precompiled Header nur für die main.cpp ist overkill.



  • Ist es nur möglich einen Precompiled Header pro Projekt zu haben? Das würde heißen, auch wenn nur seltend etwas an einem Header geändert wird: Sobald an nur einem Header eine Änderung vorgenommen wurde, werden alle Header neu kompiliert.

    pumuckl schrieb:

    Precompiled Header nur für die main.cpp ist overkill.

    Warum? Ist die Kompilierungszeit die gleiche? Lohnt es sich erst bei mehr cpp-Dateien?



  • pumuckl schrieb:

    Precompiled Header nur für die main.cpp ist overkill.

    Ja, stimmt schon. Ich wollte nur der Unmöglichkeit widersprechen. 😉



  • DarkBug schrieb:

    Ist es nur möglich einen Precompiled Header pro Projekt zu haben?

    Mir ist nicht bekannt, dass da mehrere machbar sind.

    pumuckl schrieb:

    Precompiled Header nur für die main.cpp ist overkill.

    Warum? Ist die Kompilierungszeit die gleiche? Lohnt es sich erst bei mehr cpp-Dateien?

    Der Gewinn bei einem Einsatz an nur einer Stelle ist nicht besonders groß. Dazu kommt, dass du mit Sicherheit auch andere Stellen haben wirst, wo PCH's Sinn machen, und wenn du Header, die nur einmal gebraucht werden, in den PCH einbindest, wird die Information in jeder ÜE mit PCH eingebunden, und das kostet, auch wenns im PCH vorkompiliert ist.
    Man sollte nur das in den PCH packen, was oft benutzt wird und viele andere Header einbindet.



  • Darf man mal fragen, wie lange dein Projekt zum Erstellen braucht, dass du dir über sowas Gedanken machst?



  • _matze schrieb:

    Darf man mal fragen, wie lange dein Projekt zum Erstellen braucht, dass du dir über sowas Gedanken machst?

    Wahrscheinlich hat er insgesamt schon mehr Zeit beim Nachdenken über PCH verbraten als er Compilerzeit gespart hätte 😉



  • pumuckl schrieb:

    Precompiled Header nur für die main.cpp ist overkill.

    DarkBug schrieb:

    Warum? Ist die Kompilierungszeit die gleiche? Lohnt es sich erst bei mehr cpp-Dateien?

    pumuckl schrieb:

    Der Gewinn bei einem Einsatz an nur einer Stelle ist nicht besonders groß. Dazu kommt, dass du mit Sicherheit auch andere Stellen haben wirst, wo PCH's Sinn machen, und wenn du Header, die nur einmal gebraucht werden, in den PCH einbindest, wird die Information in jeder ÜE mit PCH eingebunden, und das kostet, auch wenns im PCH vorkompiliert ist.
    Man sollte nur das in den PCH packen, was oft benutzt wird und viele andere Header einbindet.

    Wenn ich nur Header einbinde die nie verändert werden, werden diese doch nur beim ersten Kompilierungsvorgangs des Projekts mit pch kompiliert. Jeder weitere Kompilierungsvorgang ist dann schneller, oder?

    _matze schrieb:

    Darf man mal fragen, wie lange dein Projekt zum Erstellen braucht, dass du dir über sowas Gedanken machst?

    Selbst ein kleines wxWidgets Projekt mit nur einer GUI-Klasse braucht 15 Sekunden zum kompilieren. Ist das normal?



  • DarkBug schrieb:

    Selbst ein kleines wxWidgets Projekt mit nur einer GUI-Klasse braucht 15 Sekunden zum kompilieren. Ist das normal?

    15 Sekunden? Und da machst du dir Gedanken, wie du die Compile-Zeit verringern kannst? Komm wieder, wenn du eine halbe Stunde brauchst. :p 😉



  • DarkBug schrieb:

    Wenn ich nur Header einbinde die nie verändert werden, werden diese doch nur beim ersten Kompilierungsvorgangs des Projekts mit pch kompiliert. Jeder weitere Kompilierungsvorgang ist dann schneller, oder?

    Schneller, aber nicht unendlich schnell. Die Informationen, die in den PCH hineinkompiliert wurden, kosten trotzdem Zeit. Wenn du in deinem PCH 15.000 Header hast, in einer ÜE, die den PCH einbindet, aber nur 2 davon brauchst, kann es durchaus sein, dass der Compiler länger an dem PCH zu knabbern hat als an den zwei nicht vorkompilierten Headern.

    Selbst ein kleines wxWidgets Projekt mit nur einer GUI-Klasse braucht 15 Sekunden zum kompilieren. Ist das normal?

    Kommt auf die Hardware an 😉 Und darauf, ob du irgendeinen "get-it-all" Header einbindest oder nur ein, zwei Header, die nur das einführen, was du auch wirklich brauchst. Und natürlich darauf, wo du die Header einbindest (.cpp, .h)



  • -j 8 :p



  • Kellerautomat schrieb:

    -j 8 :p

    -t 32

    Was willst du uns mit diesem Kurzkommentar sagen??



  • pumuckl schrieb:

    Und natürlich darauf, wo du die Header einbindest (.cpp, .h)

    Wie meinst du das?

    P.S.: Mit ÜE meinst du Übersetzungseinheit sprich cpp, oder?



  • Mit ÜE meinst du Übersetzungseinheit sprich cpp, oder?

    Jup.

    DarkBug schrieb:

    pumuckl schrieb:

    Und natürlich darauf, wo du die Header einbindest (.cpp, .h)

    Wie meinst du das?

    Wenn du deinen wxWidgets-Header in einer .cpp einbindest, wird er nur bei der Übersetzung dieser .cpp durchgenudelt. Wenn du ihn in einen anderen Header einbindest, wird er bei der Übersetzung jeder .cpp, die diesen anderen Header einbindet, wieder von neuem durchgenudelt.

    Viele Leute binden viel zu viele Header ein, man sieht vor allem bei Anfängern häufig ein "ich binde in jeden Header mal alles ein". Tatsächlich muss man in Header aber viel weniger einbinden. Du brauchst den Header einer Klasse, wenn du von dieser Klasse ableitest wenn du eine Variable dieser Klasse als Membervariable benutzt, und wenn du eine Variable oder Methoden dieser Klasse in deinen Funktionen benutzt. Wenn du konsequent alle Funktionen in .cpp's implementierst, fällt der letzte Punkt schonmal weg (templates mal ausgenommen, die müssen ja im Header implementiert werden).
    Du brauchst keinen Header, wenn du die Klasse für folgendes benutzt:

    • als Funktionsparameter
    • als Funktionsrückgabetyp
    • für Referenzen oder Pointer auf Objekte der Klasse

    In den Fällen reicht immer eine Forward-Declaration.

    DarkBug schrieb:

    Das hier ist mehr eine generelle Frage, einen Code gibt es nicht.

    Glaube ich dir jetzt nicht mehr. 15 Sekunden Übersetzungszeit ohne Code wären verwunderlich, ebenso braucht man ohne Code auch kein wxWidgets. Zeig uns doch mal deinen 15-Sekunden-Code 🙂



  • pumuckl schrieb:

    -t 32

    Was willst du uns mit diesem Kurzkommentar sagen??

    http://www.gnu.org/software/make/manual/make.html#Parallel
    🤡


Anmelden zum Antworten