Standardbibliotheken zusammenfassen - Programm langsamer?
-
Hallo nochmal

Mich würde einmal interessieren ob das Programm IRGENDWELCHE Nachteile bei der Runtime hat wenn ich (als Beispiel) immer nur in jedem C++ Programm folgendes mache...
#include "standard.h"
Und in der standard.h stehen dann ALLE Bibliotheken die ich in meinem Programm benötige.. zB wenn ich einmal sqrt() brauche lass ich die in standard.h includieren. Jetzt ist das aber so dass irgendwann ziemlich viele Headerdatein includiert werden... ist das irgendwie schlimm? Macht der Präprozessor immer nur die Definitionen in das Programm die auch benötigt werden oder stopft dieser einfach alles rein? Und wenn ja macht das irgendwas am Programm? Immerhin wird das ganze ja eigentlich dann nur deklariert und niemals Definiert oder benutzt.
Ein Beispiel.. wenn ich jetzt die math.h includiere, jedoch garnix aus der Bibliothek brauche UND auch nix im Programm schreibe (zB sqrt()) wird dann diese Bibliothek trozdem geladen?
Und bitte sagt nicht - dann lad doch die Biblothek nicht
Hab das mal in einem YouTube Video gesehen der hat alle Bibliotheken in die stdafx.h geschrieben...
-
Hat keinerlei Nachteile - und macht keinen Unterschied im Programm, was du alles included hattest...
Dauert nur länger beim Compilieren (wobei man in precompiled headern wahrscheinlich so gar alle standard-header includen sollte, damit man sie noch seltener ändert, weil sonst ja wieder alles neu compiliert werden müsste...).
bb
-
daybreak schrieb:
Und bitte sagt nicht - dann lad doch die Biblothek nicht
Hab das mal in einem YouTube Video gesehen der hat alle Bibliotheken in die stdafx.h geschrieben...Gut, dann ist natürlich verständlich, dass du das selber auch machen willst.
daybreak schrieb:
#include "standard.h"
Und in der standard.h stehen dann ALLE Bibliotheken die ich in meinem Programm benötige..
Was bringt dir das? Sich die Überlegung zu sparen, welcher Teil des Programms welche Header benötigt? Das würde ich mir ehrlich gesagt nicht angewöhnen. Durch die Header kann man seine Dateien auch ein wenig kontrollieren. Dadurch, dass ich ein
#include <fstream>sehe, weiss ich, dass das Modul mit FileStreams arbeitet. Ich beschränke meine Abhängigkeiten eigentlich auf das Nötigste. Bei eigenen Dateien musst du das mit der Zeit so oder so machen...unskilled schrieb:
wobei man in precompiled headern wahrscheinlich so gar alle standard-header includen sollte, damit man sie noch seltener ändert, weil sonst ja wieder alles neu compiliert werden müsste
Äh, wie, noch seltener? Wie oft änderst du die Standardbibliothek?
-
Nexus schrieb:
unskilled schrieb:
wobei man in precompiled headern wahrscheinlich so gar alle standard-header includen sollte, damit man sie noch seltener ändert, weil sonst ja wieder alles neu compiliert werden müsste
Äh, wie, noch seltener? Wie oft änderst du die Standardbibliothek?
War das so unglücklich formuliert?
Ich meinte damit:
Wenn man beispielsweise list nicht included, weil man es nicht braucht, aber iwann später dann merkt: hmm.. hier wäre ne liste doch ganz gut und setzt erst dann dasinclude <list>dort rein, dann muss er alles noch ma neu compilieren, weil sich der precompiled header geändert hat - hätte er gleich alles eingebunden, was die standard-lib bietet, hätte er also zeit gespart, obwohl das erste mal compilieren vll 2 sekunden länger gedauert hätte...bb
-
Ah, sorry, ich hab das "Standard-Header ändern" wohl zu wörtlich genommen.

-
Naja es gibt durchaus einige Libs, wo allein das inkludieren der Header schon dazu führt, dass irgendwas mitgelinkt wird.
Einige Libs verwenden z.B. globale Variablen (entweder static oder in einem anonymen Namespace), um diverse Dinge vorab zu initialisieren.
Das führt dann dazu dass Code aus diesen Libs mitgelinkt wird, obwohl die Libs vielleicht garnicht verwendet werden.
-
hustbaer schrieb:
Naja es gibt durchaus einige Libs, wo allein das inkludieren der Header schon dazu führt, dass irgendwas mitgelinkt wird.
Einige Libs verwenden z.B. globale Variablen (entweder static oder in einem anonymen Namespace), um diverse Dinge vorab zu initialisieren.
Das führt dann dazu dass Code aus diesen Libs mitgelinkt wird, obwohl die Libs vielleicht garnicht verwendet werden.Sollte ein kluger Linker nicht merken, das diese Variablen nicht benutzt werden und diese dann weglassen?