all-include-header



  • ZeroXCola schrieb:

    Was haltet von dem Motto alle includes in eine headerdatei zu packen und diese dann in jeder einzeldatei zu includen?

    Alle? Nein, aber die meisten ist eine gute Idee -> Stichwort: precompiled header.



  • Shade Of Mine schrieb:

    ZeroXCola schrieb:

    Was haltet von dem Motto alle includes in eine headerdatei zu packen und diese dann in jeder einzeldatei zu includen?

    Alle? Nein, aber die meisten ist eine gute Idee -> Stichwort: precompiled header.

    👎


  • Mod

    Shade Of Mine schrieb:

    Alle? Nein, aber die meisten ist eine gute Idee -> Stichwort: precompiled header.

    Auch wieder so ein Feature, bei dem 10% weniger Fragen im Forum kämen, wenn es das nicht gäbe 🙂 .

    edit: Oder besser gesagt: Wenn es nicht standardmäßig aktiv wäre. Gegen gute Features, bei denen man bei Benutzung aufpassen muss, habe ich an sich nichts.



  • Besser gefragt: warum brauchen wir überhaupt Header-Dateien? 💡 Ohne Header-Dateien würden solche Fragen erst überhaupt nicht auftreten, und dann wäre auch PCH unnötig.



  • Artchi schrieb:

    Besser gefragt: warum brauchen wir überhaupt Header-Dateien? 💡 Ohne Header-Dateien würden solche Fragen erst überhaupt nicht auftreten, und dann wäre auch PCH unnötig.

    Weil sich vor ca. 40 Jahren mal jemand gedacht hat, dass header Dateien eine gute Idee sind.



  • Gruum schrieb:

    Weil sich vor ca. 40 Jahren mal jemand gedacht hat, dass header Dateien eine gute Idee sind.

    Ohne Klassen aber insbesondere ohne Templates sind sie das ja auch. Zu C++ passen sie aber leider so gar nicht mehr.



  • 314159265358979 schrieb:

    👎

    http://gamesfromwithin.com/the-care-and-feeding-of-pre-compiled-headers

    Wenn du mal groß bist, wirst auch du den Sinn von PCH verstehen 😉

    Es hat seinen Grund warum alle großen Compilerhersteller PCH supporten und in jeder Doku wirst du etwas derartiges lesen:

    Clang Documentation schrieb:

    Precompiled headers are a general approach employed by many compilers to reduce compilation time. The underlying motivation of the approach is that it is common for the same (and often large) header files to be included by multiple source files. Consequently, compile times can often be greatly improved by caching some of the (redundant) work done by a compiler to process headers. Precompiled header files, which represent one of many ways to implement this optimization, are literally files that represent an on-disk cache that contains the vital information necessary to reduce some of the work needed to process a corresponding header file. While details of precompiled headers vary between compilers, precompiled headers have been shown to be highly effective at speeding up program compilation on systems with very large system headers (e.g., Mac OS/X).



  • Vorkompilierte Header braucht nicht, wer ordentlich mit seinen Headern und Includes umgeht. Das mit dem groß werden kannst du ja mal volkard sagen, wenn er wieder da ist.



  • 314159265358979 schrieb:

    Vorkompilierte Header braucht nicht, wer ordentlich mit seinen Headern und Includes umgeht.

    Das ist einfach nur falsch.

    Wenn du zB Datei foo.h in 3 .cpp Dateien inkludierst, muss diese 3 mal kompiliert werden. Wenn diese foo.h nun sehr gross ist, weil sie zB generellen Framework Code enthaelt dann wird diese pro .cpp Datei kompiliert. Bei PCH hat man den Aufwand sage und schreibe 0 mal. Wenn du also zB eine Header Datei nimmst, die du gerne verwendest, wie zB <string>, dann machen wir ne kleine Anschauung:

    Bei meinem VC++ ist <string> 21KB gross und haengt von <istream> ab. Diese ist 34KB gross und haengt von <ostream> ab. Diese ist 30KB gross und haengt von <ios> ab. Diese ist 10KB gross und haengt von <xlocnum> ab. Diese ist 51KB gross und haengt von <climits>, <cmath>, <cstdio>, <cstdlib> und <streambuf> ab. Und hier hoere ich jetzt mit dem zaehlen auf.

    Wenn ich <string> das ich in einen grossteil meiner Modulen brauche in einen PCH packe, reduziere ich die Zeit die ich fuers kompilieren brauche enorm. Schau mal wieviel KB das sind nur fuer ein dummes std::string.

    Im Endeffekt kann man natuerlich sehr viel Zeit sparen indem man die Header inkludierung limitiert und nur die notwendigen Header einbindet - das ist vollkommen logisch. Aber wenn man das schon getan hat, helfen PCH nochmal enorm. Und PCH helfen auch enorm wenn man nicht haendisch optimiert 😉

    PCH bringen nur Vorteile und keine Nachteile. Der einzige Nachteil den es theoretisch gibt ist der, dass es die portierbarkeit des Codes zwischen einzelnen Compilern erschwert - andererseits: wenn ein Compiler keine PCH kann, dann kann ich dort mit laengeren Buildzeiten leben.



  • Shade Of Mine,

    ja, PCH sind toll, aber Pi weiss es halt besser, was willste da machen?
    Ich sehe keinen Sinn mehr darin mit ihm zu diskutieren, vor allem wenn er wieder mal in den "ich hab Recht!!11elf" Modus geschaltet hat.



  • Shade Of Mine schrieb:

    PCH bringen nur Vorteile und keine Nachteile.

    Mit PCHs hast du genau dieselben Probleme wie beim läßlichem Gebrauch eines Master-Headers. Man handelt sich gelegentlich Konflikte ein, und außerdem neigt man dazu, Abhängigkeiten nicht mehr zu "sehen", weil irgendwelche Sachen, die im PCH stehen, eh sichtbar sind, und also öfter mal ein #include zu vergessen. (Dem kann man immerhin entgegenwirken, wenn man zur Kontrolle öfters mal ohne PCH kompiliert.)

    Natürlich sind PCHs sinnvoll. Meine IDE ist auch insoweit davon abhängig, daß Code Completion immer den realen Compiler benutzt und ohne PCH fast ebensolange braucht wie eine reguläre Compilierung 😮 Erst mit richtig eingesetelltem PCH wird die Latenz vernachlässigbar. PCHs sind ein nützliches Tool, wenn man damit umzugehen weiß und die möglichen Konflikte kennt. Aber "keine Nachteile" finde ich trotzdem etwas optimistisch.

    Edit: Probleme



  • audacia schrieb:

    Aber "keine Nachteile" finde ich trotzdem etwas optimistisch.

    Ich sehe da nicht viel andere Probleme als bei normalen Includes.
    Da hat man auch sehr schnell mal ein paar includes zuviel drin und erzeugt durch fehlende includes abhaengigkeiten die nicht notwendig sein sollten.

    header sind einfach furchtbar. das ist immer ein ziemliches gefrickel 😕

    Aber ja, PCH sind kein heiliger Gral und ich habe sicher ein bisschen uebertrieben. Aber wir sind uns ja wenigstens einig dass PCH eine gute Erfindung sind 🙂



  • Shade Of Mine schrieb:

    audacia schrieb:

    Aber "keine Nachteile" finde ich trotzdem etwas optimistisch.

    Ich sehe da nicht viel andere Probleme als bei normalen Includes.

    Ein Problem ist z.B., dass einen PCHs dazu "ermuntern" haufenweise Files über das PCH File in jedem .cpp File zu inkludieren.
    Dadurch übersieht man viel schneller, wenn man in einem Header-File vergessen hat ein anderes zu inkludieren.

    // PCH.h ------------------------------------------------------
    #include <string>
    
    // MyFoo.h ----------------------------------------------------
    // #include <string> FEHLT
    #pragma once
    
    std::string Foo();
    
    // MyFoo.cpp --------------------------------------------------
    #include "PCH.h"
    #include "MyFoo.h"
    
    // ...
    

    Das Projekt wird wunderbar compilieren, den Fehler merkt man dann erst beim Compilieren eines Clientprogramms.


Anmelden zum Antworten