Precompiled header



  • Hi,

    ich bin noch recht neu in der C++ Programmierung.
    Ich benutze Visual Studio 2012 Express.

    Ich bastel im Moment an einem kleinen 2D Spiel (mit DirectX11).
    Die Engine wird langsam etwas komplexer, ich schätze knapp 50 Klassen im Moment.
    Leider dauert das Compilieren mitlerweile sehr lange, um die 2 Minuten.

    Ich hab gelesen, dass "Precompiled header" das compilieren beschleunigen sollen.
    Leider hab ich keine Ahnung, wie das genau funktioniert, und wie ich ein bestehendes (lib-) Projekt dahingehend verändern kann.

    Man soll wohl eine stdafx.h in jeder cpp-Datei includieren. Leider weis ich nicht, wie der Inhalt der stdafx.h aussehen muss.

    Kurz zum Projekt-Aufbau:
    Ich habe eine Main-Header Datei, in der alle Namespaces und Klassen deklariert sind. In dieser Header-Datei werden dann alle Header der einzelnen Klassen includiert.
    In den cpp-Dateien wird dann nur die Main-Header Datei includiert.

    Kann mir da jemand mit den Precompiled Header weiterhelfen?

    Gruß



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Raven280438 schrieb:

    Ich habe eine Main-Header Datei, in der alle Namespaces und Klassen deklariert sind. In dieser Header-Datei werden dann alle Header der einzelnen Klassen includiert.
    In den cpp-Dateien wird dann nur die Main-Header Datei includiert.

    Well, there's your problem...

    Wenn du einfach überall alle Header inkludierst, ohne darüber nachzudenken, ob sie nun überhaupt benötigt werden oder nicht, ist ja wohl klar, dass das Kompilieren ewig dauert... 😉



  • Hi,

    danke für die Antwort.

    Da ich in C++ bisher nur kleine Projekte gemacht habe, hatte ich damit noch nie Probleme 😉

    Wie kann ich die Header-Struktur dann besser aufbauen?

    Soll ich in die einzelnen cpp-Dateien nur die Klassen-Header einbinden, von denen ich auch wirklich Klassen verwende? (Ich hab für jede Klasse 1 Header und 1 Quellcodedatei)

    Am Ende brauch ich aber trotzdem noch eine Header-Datei mit allen Klassen, da ich sie ja in das Projekt, in dem ich die Engine-lib verwende, einbinden muss.

    Kann mir da jemand weiterhelfen? Wie wird das normalerweise gehandhabt?

    Gruß



  • Raven280438 schrieb:

    Soll ich in die einzelnen cpp-Dateien nur die Klassen-Header einbinden, von denen ich auch wirklich Klassen verwende? (Ich hab für jede Klasse 1 Header und 1 Quellcodedatei)

    ja zum Beispiel...

    Raven280438 schrieb:

    Am Ende brauch ich aber trotzdem noch eine Header-Datei mit allen Klassen, da ich sie ja in das Projekt, in dem ich die Engine-lib verwende, einbinden muss.

    Ich bezweifle sehr, dass man, um deine "Engine-lib" einfach nur zu verwenden, wirklich sämtliche Header inkludieren muss. Falls das tatsächlich der Fall ist, dann würd ich mir nochmal ernsthaft über den Sinn dieser lib und das Design der Schnittstelle Gedanken machen...



  • Hi,

    ok, dann werd ich die Struktur nochmal überarbeiten.

    Da ich dann sowieso die ganze Engine nochmal überarbeite: wie funktioniert das jetzt mit den Precompiled Header?

    Gruß



  • Ich würd den Precompiled Header Kram erstmal vergessen und mich um eine saubere Struktur kümmern. Wenn es dann wirklich immer noch nötig sein sollte, kannst du dich immer noch damit beschäftigen... 😉



  • Hi,

    da es im Visual Studio beim Anlegen eines neuen Projektes standardmäßig an ist, dachte ich dass es auch normal ist es zu verwenden. 😉

    Aber wenn es nicht nötig ist, lass ich es erstmal.

    Gruß



  • Kurze Erklärung wie das mit den Headern funktioniert:
    Header sind letztlich auch nur ganz normale Sourcedateien, nur packt man da laut Konvention nur Definitionen und eventuell kleine Funktionen, usw. rein, aber nicht den Code der Klassen.
    Wenn du einen Header inkludierst sagst du dem Präprozessor dass er den Header an dieser Stelle in die Sourcedatei reinkopieren soll. Du könntest theoretisch auch in den Sourcedateien die die Klassen benutzen auch jedesmal die Vorwärtsdeklaration von Hand reinschreiben, aber mit Headern ist es schön getrennt.

    Aber wenn du jetzt einen Main-Header hast der alle anderen inkludiert hast du gleich 2 Probleme:

    1. Jedes Sourcefile wird plötlzich viele 10000 bis 100000 Zeilen lang wenn du Pech hast, bzw. viele Header der STL oder aufwändiger Libs wie z.B. Boost inkludierst. Da der Compiler jedesmal so eine Masse an Code parsen muss wird es logischerweise langsam.
    2. Jedes Mal wenn du etwas in einem Header änderst müssen alle Sourcefiles neukompiliert werden, auch langsam.

    Darum zuerst einmal die Struktur anpassen. D.h. nur die Header der Klassen inkludieren die du auch benutzt.
    Danach einen vorkompilierten Header verwenden, in den packst du alle Abhängigkeiten die sich fast nie ändern. D.h. STL und die von Abhängigkeiten.
    Verzichten würde ich auf vorkompilierte Header nicht, schneller kompilieren ohne Nachteile ist doch toll. 😃

    Am Ende brauch ich aber trotzdem noch eine Header-Datei mit allen Klassen, da ich sie ja in das Projekt, in dem ich die Engine-lib verwende, einbinden muss.

    Kann mir da jemand weiterhelfen? Wie wird das normalerweise gehandhabt?

    Das wird aufgeteilt. Ich würde jeder Klasse einen extra Header geben. Du kannst sie aber ja zusammenfassen, quasi ein Header der zusammengehörende Klassen. Dann muss man nicht immer jede Kleien Klasse extra inkludieren.



  • Hi,

    ich hab mal ein bisschen nach Precompiled Header gegooglet und diesen Beitrag gefunden.

    Ist das so in Ordnung was da steht? (Kann es erst heut Abend selber testen)

    Gruß



  • Sollte passen, ja.


Anmelden zum Antworten