Übersicht bei nur einer Datei



  • Servus,

    ich habe nur in eine Cpp-Quelltext-Datei. Jetzt will ich darin Ordnung schaffen. Ich habe dort unterschiedliche Namespaces, darin einige Klassen, dazu auch globale Variablen ... kurz: eine richtig lange unordentliche Datei.

    Ich habe mich nun schon entschieden bei Funktionen die Deklaration und die Definition zu trennen, das ist schon mal nicht schlecht. Wohin kommt dann eigentlich der sinnmachende Doxygen-Kommentar?

    Macht das auch Sinn dies bei den eingesetzten Klassen und Strukturen zu machen, ich habe ja keine header-Dateien, vermute aber, dass ich technisch gesehen die Implementierung da schon aus der Klasse rausziehen könnte? Wie ist das dann mit Namespaces ?

    Und dann - nach welchen Schema sollte ich die vielen Definition dann ordnen?

    Ich versuche mal etwas Ordnung in mein Projekt zu bekommen und melde mich dann wieder wenn es etwas besser aussieht, danke schon mal für den ein oder anderen generellen Tipp.



  • Hm, geht es schon los ... bei Klassen lese ich gerade im Breymann-Buch, dass inline-Elementfunktionen sehr fix sind. Man soll aber auch inline nur innerhalb der gleichen Datei nutzen. Ich habe aktuell die Definition in der Klasse - wenn ich nun die Methodenimplementierung raus hole und als inline kennzeichne, habe ich keinerlei Nachteile oder?

    Insgesamt ist es nämlich auch sehr wichtig, dass das Programm schnell ist und auf einem Rechnercluster läuft, daher wollte ich alles in eine Datei packen - so gibts keine Scherereien mit dem Kompiliervorgang und auch hoffentlich wenig unvorhergesehene Stolpersteine für mich als Cpp-Laie.



  • Jay1980 schrieb:

    Ich habe aktuell die Definition in der Klasse - wenn ich nun die Methodenimplementierung raus hole und als inline kennzeichne, habe ich keinerlei Nachteile oder?

    Du kannst da inline hinschreiben, aber wenn die Definition in anderen Übersetzungseinheiten nicht sichtbar ist, kann der Compiler da nicht inline n (er ignoriert es).
    Es hat schon einen Sinn, dass man Definition von Deklaration trennt. inline ist eher der seltene Spezialfall, den man einsetzen kann, wenn man etwas davon versteht.
    Wenn dein Programm am Ende zu langsam ist und das wirklich an Funktionsaufrufen liegt, kann man immer noch gezielt und mit Verstand inline einsetzen.



  • Danke, wieviele Übersetzungseinheiten habe ich in diesem Fall: ich habe Headerfiles ha.h und hb.h. In den Klassen stehen habe und auch direkt die Implementierungen darunter mit inline. Es gibt im ganzen Cpp-Programm nur eine Cpp-Datei, naemlich die main.cpp, dort werden die Headerfiles via include eingebunden.

    Nach meinem jetzigen Kenntnisstand sollte ich dadurch genau eine Übersetzungseinheit haben, das inline sollte immer berücksichtigt werden und das Programm sollte genau so schnell sein, wie wenn alles in der main.cpp-Datei steht.
    Lieg ich da richtig?



  • Genau. #include macht nix anderes, als dem Präprozessor zu sagen, dass er den inhalt der includierten Datei an die Stelle des includes in der includierenden Datei schreiben soll.





  • Danke für die bisherigen Antworten, eine ergänzende Frage stelle ich mir gerade aber noch: Wie ist das eigentlich, spielt es eine Rolle für die spätere Performanz des Programms, ob ich eine oder mehrere Übersetzungseinheiten habe?


  • Mod

    Jay1980 schrieb:

    Danke für die bisherigen Antworten, eine ergänzende Frage stelle ich mir gerade aber noch: Wie ist das eigentlich, spielt es eine Rolle für die spätere Performanz des Programms, ob ich eine oder mehrere Übersetzungseinheiten habe?

    Falls du Funktionen in deiner innersten Schleife aus anderen Übersetzungseinheiten hast die durch inlining stark profitieren würden und du deinem Compiler nicht beibringen kannst, dies zur Linkzeit zu optimieren, dann kann die Aufteilung negativ für die Laufzeit sein.

    Das sind aber beides Voraussetzungen die tendenziell eher nicht gelten, zumindest wenn du alles richtig machst. Funktionen die in einer Schleife wichtig sind, sind von der logischen Aufteilung her oftmals in der gleiche Übersetzungseinheit. Und selbst wenn nicht, macht man Funktionen die sich inline lohnen würden oftmals schon im Header inline, eben weil es in der Regel nur Ein- oder Zweizeiler sind. Und alle großen Compiler die mir einfallen unterstützen Optimierung zur Linkzeit.


Log in to reply