Frage zur Kompilierung (cpp und h)



  • 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
    🤡



  • Ach sooo. sag das dazu, so völlig aus dem kontext gerissen kann man da wenig mit anfangen.
    Das setzt allerdings voraus dass er gmake benutzt. Und dass er genügend Kerne hat, dass sich -j 8 lohnt. Ich nehme mal an, dass er das übliche Einsteiger-Instrument benutzt: VS Express. 2008 oder 2010. Beide parallelisieren meines Wissens sowieso schon automatisch...



  • Ok, solch eine Kompilierungszeit ist also ganz normal und Optimierungen bringen jetzt noch nicht spürbar viel. Somit ist meine Frage beantwortet. Danke für eure Hilfe.

    pumuckl schrieb:

    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 🙂

    xD. Das ist bei wxWidgets Applicationen bei mir immer so. Also unter 15 Sekunden komm ich nicht weg. Normale Konsolenanwendungen hingehen werden in null komma nichts kompiliert.

    pumuckl schrieb:

    Ach sooo. sag das dazu, so völlig aus dem kontext gerissen kann man da wenig mit anfangen.
    Das setzt allerdings voraus dass er gmake benutzt. Und dass er genügend Kerne hat, dass sich -j 8 lohnt. Ich nehme mal an, dass er das übliche Einsteiger-Instrument benutzt: VS Express. 2008 oder 2010. Beide parallelisieren meines Wissens sowieso schon automatisch...

    Ich benutze den normalen MinGW von www.mingw.org.



  • DarkBug schrieb:

    Ich benutze den normalen MinGW von www.mingw.org.

    Mit dem Compiler übersetzt du einzelne Übersetzungseinheiten, keine ganzen Projekte. Ich nehme mal an, dass MinGW gmake benutzt, dann müsstest du das entsprechend mit -j <Prozessorzahl> übersetzen.
    Die Frage ist dann allerdings auch noch, ob das die Übersetzugnszeiten oder die Linkzeiten sind, die bei dir so lange dauern.



  • g++ wird zum kompilieren und zum linken verwendet. mingw32-make.exe wechselt anscheinend irgendwie die Ordner.

    Ich möchte meine Toolchain auch nicht wechseln. Werde mich erstmal damit hingeben.



  • Dann ist das mingw-make dein build-tool, dem du vielleicht beibringen kannst, parallel zu bauen. Vermutlich auch mit besagter -j option. Einfach mal die .exe ohne irgendwas aufrufen oder mit -? oder -h als Parameter.

    Erklärt natürlich nicht warum es so eeeewig lang dauert.

    Welchen wxWidgets-Header bindest du denn ein, und welche Klassen nutzt du davon?


Anmelden zum Antworten