Allgemeine Fragen



  • Hey Leute,

    vorweg : Ich weiss nicht so wirklich wo ich mit den Fragen hin soll, also hoffe ich dass ich hier richtig bin .

    Es geht mir gerade um das den generellen Aufbau eines Programmes bzw. wie ein Compiler arbeitet. Naja, ich weiss nicht wirklich wie ichs beschreiben soll,ich stell einfach mal paar Fragen :
    1. Das Linken eines Compilers ist mir noch völlig unklar ... wie genau geschieht das eig. ? Was ist static linking, was ist dynamic linking ?
    2. Wenn ich ein einfaches Hello-World programme disassemble bekomme ich c.a 300-400k Zeilen Assembler-code ausgespuckt ( zb bei OllyDbg). Woher kommt der ganze Code ? Ist das der Sourcecode der ganzen .dll's ?
    3. Da wäre ich bei der nächsten Frage : Was für .DLLs verwendet ein Programm eig. ? Ich denke mal, dass ein Programm, das die WinApi verwendet mehr .DLLs benötigt als eines, das lediglich Konsole-basiert ist ? Gibt es irgendwo eine Übersicht darüber, welche .DLLs benötigt werden ?
    4. Wo wird letzendlich ein Programm "gespeichert" ? Die Variablen etc. werden ja auf den Stack gepusht, aber wo liegt der ? Hat jedes Programm ein Maximum an Speicher, das es aufbrauchen darf ?
    5. Was hat es mit der "Release-Build"-Option bei IDE's auf sich ?

    Villeicht habt ihr schon erkannt in welche Richtung meine Fragen gehen, ich würde halt generell gerne mal wissen, wie das alles eig. aufgebaut ist.
    Kennt villeicht jemand eine Seite, an der Solche Fragen beantwortet sind ? Ich finde sonst immernur zu einzelnen Stichpunkten was und die verlangen dann wieder Wissen von anderen, ungeklärten Fragen, weswegen ich meistens Banhof verstehe. Diese Intel32 Developer Documentations oder so sind ja auch eher was für Experten und gehen wohl auch viel weiter, als ich wissen will und soll.

    Danke auf jeden Fall schonmal fürs Durchlesen und sorry, wenn das hier a) in falschen Forum ist und b) durcheinander gewürfelte Fragen sind 😛

    Mfg



  • Also beim statischen linken werden .lib Librarys verwendet. Das Programm benötigt dann keine DLLs, wird aber deutlich größer. Dynamisches Linken bedeutet demnach das DLLs bei der Programmausführung benötigt werden, das Programm aber dafür kleiner ist.

    Wenn man viel Code angezeigt bekommt, kann das daran liegen, dass noch Debuginformationen mit ausgegeben werden. Das steht auch in direktem Zusammenhang mit deiner Frage 5. Ein Release-Build enthält keine Debuginformationen mehr. Das Programm wird kürzer und wird schneller ausgeführt. Release steht für "veröffentlichen", d.h. wenn dein Programm fertig ist wird es als Release ausgeliefert. Solange man dran arbeitet, benutzt man den Debug-Mode, damit man beim Debuggen eben den Quellcode an der Fehlerstelle nachvollziehen kann.

    Der Speicherplatz den ein Programm verbraucht hängt davon ab, wieviel Speicher du im Programm anforderst. Wenn man Befehle wie malloc oder new verwendet, wird Speicher angefordert. Hat man unsauber programmiert, kommt es zu sog. Speicherlecks. D.h. ein Programm fordert ungewollt immer wieder neu Speicher an, bis es zum Überlauf kommt.



  • Debug oder Release hat nicht mit der Geschwindigkeit zu tun. Beim Debug-build werden nur Informationen zur EXE hinzugefügt, die ein Debugger, wie z.B. OllyDbg, Laden und Auswerten kann - während der normalen Programmausführung (ohne Debugger) spielen diese keine Rolle.



  • Also ich habe die Erfahrung gemacht, dass sich das sehr wohl auf die Ausführungsgeschwindigkeit eines Programms auswirkt. Z.B. bei einem Testprog das 3D-Objekte rendert und die FPS anzeigt, hatte ich eine deutlich höhere Framerate im Release-Build als im Debug-Modus! Beim Debuggen werden doch z.T. auch deutlich größere Debug-Libs gelinkt. Das muss doch einen Effekt haben?

    EDIT: Bevor wir aneinander vorbeireden: Ich spreche von der Einstellung "Debug" in der Projektkonfiguration, aber wähle "Starten ohne Debuggen".



  • lazer was du meinst ist der Optimierungseffekt.

    Im Release-Modus wird dein Code vom Compiler optimiert. Deswegen ist deine .exe deutlich schneller als im Debug-Modus.

    Was 'debugger___ ' meinte, war, dass es keinen Performanz-Unterschied zwischen Debug- und Release-Modus, geben würde, wenn im Release-Modus der Code nicht optimiert werden würde. Weil die Debug-Informationen nur eine Rolle spielen, wenn man einen Debugger dazu schaltet.

    🙂



  • Der Erklärer.org schrieb:

    Im Release-Modus wird dein Code vom Compiler optimiert...

    Ja, das macht Sinn. Was mir aber noch einfällt, was den Debug-Code langsamer machen könnte, sind evtl. eingbaute IF_DEBUG Statements, die nur im Debug-Modus ausgeführt werden.



  • Was hat das denn für einen Vorteil wenn man statisch linkt ? Protabilität ?
    Was genau wird eigentlich alles bei einem simplen Hello-World Programm gelinkt ? Garnichts ?

    Debuginformationen in Form von Code ? Debuggen an sich heißt doch eigentlich nur, dass man ein Programm , das nicht rictig läuft, auf den verantworlichen Fehler untersucht ?
    Ich werde mal ein Programm im Release Mode compilen und dann in einen Debugger laden, um zu sehen ob ich dann mehr verstehe. Aber irgendwie bezweifle ich das ,obwohl ich eigentlich die Assembler-Befehle an sich kenne.

    New und malloc allokieren ja Speicher auf dem Heap, aber der Stack an such braucht ja auch Platz, oder ? Wenn ich zb ein 500-byte Array anlege. Beim Stack is aber soweit ich weiß der Unterschiched, dass die Grösse zu compilezeit feststeht. Bei Heap ist das ja anders, deswegen wird er dynamischer Speicher genannte, nehme ich mal an.
    Aber wo liegen Heap und Stack ? Gibts da einen Gesammt-Speicher ? Ist das der Arbeitsspeicher ? Die Festplatte wirds ja wohl kaum sein 😛

    An dieser Stelle erstmal danke für die Antworten ! Haben sich ein paar Sachen geklärt bei mir 🙂 ( Vor allem wieso ich auf diese Release-Sache und das mit dem statischen/dynamischen Linken immer in Threads stosse, in denen es um die Geschwindigkeit eines Programmes geht )

    Mfg



  • Der Vorteil, wenn man ein Programm veröffentlicht was statisch gelinkt wurde, ist, dass man keine eigenen oder Fremd-DLLs mitliefern muss. Die müssten ja wieder ins System eingebunden werden, damit sie vom Programm gefunden werden. Der Nachteil ist, wie schon gesagt, dass das Programm u.U. viel größer ist.

    Es macht aber Sinn Programme dynamisch zu linken, wenn auf dem Rechner die DLLs sowieso schon vorhanden sind. Beispiel: DirectX, da existieren die DLLs schon, wenn man eine DX-Version installiert hat. Und alle Progs die DX verwenden, können dann auf diese zugreifen.

    Bei einem simplen "Hello World, dass aus der Konsole läuft, dürften nur sehr wenige Standard-Libs gelinkt werden und das Programm dürfte sehr kurz sein. Man kann relativ leicht herausfinden, welche das sind, wenn man mal nach den Funktionsaufrufen, die man verwendet hat in der M$-Doku nachschlägt. Da sind nämlich die Header und Libs angegeben.

    Was Heap und Stack genau sind steht vom Prinzip hier:

    http://de.wikipedia.org/wiki/Dynamischer_Speicher

    ... und dann gibts noch den Cache in verschiedenen Leveln, der spielt auch noch mit. Das Ganze ist schon recht komplex. Ich würde sagen, wenn Du es so genau wissen willst, kauf dir ein gutes Buch zum Thema Speichermanagement 😉


Anmelden zum Antworten