Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

idontknow

unregistriert

11

11.04.2010, 21:18

Werd mich dran halten, muss aber zu meiner Verteidigung sagen dass ich geschrieben habe

Funktion/Methode; Klasse

Und im Code kam zuerst eine leere Funktion, dann eine Klasse mit eienr leeren Methode und dann eine leere Klasse hab das für leicht verständlich gehalten x/

12

11.04.2010, 21:28

wird eigentlich während des kompilierens oder erst danach optimiert?

teils, teils. bei Visual C++ kann man zum einen beim Compiler einiges an Optimierung einstellen, zum anderen aber auch einige Dinge beim Linker. z.B. kann man den nicht verwendete Symbole entfernen lassen, was dann glaub ich bedeutet, das ncith aufgerufene Funktionen tatsächlich entfernt werden.

edit: wenn das stimmt was PCShadow schreibt, warum gibt es bei deklarierten aber nicht definierten funktionen einen linkerfehler und keinen kompilerfehler?

der Compiler betrachtet immer nur eine Übersetzungseinheit, eine .cpp nach Präprozessor, also das, was aus .cpp und #includes entsteht. Die funktion könnte aber in einer anderen definiert sein, also setzt der Compiler dort nur einen externen Verweis. Und der Linekr löst dann diese externen Verweise auf - oder beschwert sich eben, wenn er einen ncith findet.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

13

11.04.2010, 21:30

das heißt der kompilierte code wird in assemblerform bei den richtigen einstellungen nochmal optimiert bevor er durch den assembler gejagt wird?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

14

11.04.2010, 21:35

hm, ich glaub eher, das der Compiler schon im wesentlichen Maschinencode produziert, nru mit zusätzlichen informationen, dei der Linker benutzt, um externe Verweise aufzulösen und vllt noch n bischen zu optimieren.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

15

11.04.2010, 21:45

Werd mich dran halten, muss aber zu meiner Verteidigung sagen dass ich geschrieben habe

Funktion/Methode; Klasse

Und im Code kam zuerst eine leere Funktion, dann eine Klasse mit eienr leeren Methode und dann eine leere Klasse hab das für leicht verständlich gehalten x/

Woher sollen wir wissen, was du genau meinst mit "Funktion/Methode; Klasse"?!

Optimierung ist schon ein heikles Thema. Vor allem bei Inlining Sachen kann der Compiler nicht wirklich etwas machen, wenn er den genauen Code nicht kennt.
Interessanter Artikel gibts heir:
http://msdn.microsoft.com/en-us/magazine/cc301698.aspx

FalkT

Treue Seele

Beiträge: 125

Wohnort: AC

  • Private Nachricht senden

16

12.04.2010, 16:38

C-/C++-Quelltext

1
2
3
4
void foo(void)
{

};


Der Code wird mitkompiliert und das Programm führt diese Funktion auch aus, aber da sie nichts macht, passiert auch nichts weiter und das Programm wird weiter ausgeführt. D.h. es wird kurz reingesprungen und dann wieder raus. Das sieht man z.B. wenn man nen Breakpoint in die Funktion setzt und den Debugger startet.
Das ist so nicht richtig !
Kompilier mal mit Optimierungen und Debug-Informationen und dann step nochmal da durch.

Bei GCC4 fällt sowas komplett raus, da steht dann auch kein asm-noop, geschweige denn irgendwas.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

17

12.04.2010, 17:17

Bei GCC4 fällt sowas komplett raus, da steht dann auch kein asm-noop, geschweige denn irgendwas.

Aber nur in der gleichen Compilation Unit. Da gilt genau das was bisher geschrieben wurde. Die aktuellen (stable) Versionen von GCC erzeugen Maschinencode (mit Assembler als Zwischenschritt), bei dem zum Zeitpunkt des Linkens nicht mehr die nötigen Informationen vorhanden sind, um Funktionsaufrufe zu entfernen. Mit Version 4.5 (seit kurzem als Release Candidate zu bekommen) bekommt der GCC allerdings auch die Möglichkeit in einen Bytecode zu compilieren, der dann beim Linken in Maschinencode umgewandelt wird. Dann können dort auch unnötige Funktionsaufrufe entfernt werden.

18

12.04.2010, 17:37

Wie wärs mit Thread lesen, bevor man posted?
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

Werbeanzeige