Thread Bitte um Hilfe bei bless Fehler (39 answers)
Opened by bianca at 2019-09-28 17:06

Raubtier
 2019-10-01 11:18
#190603 #190603
User since
2012-05-04
1054 Artikel
BenutzerIn

user image
2019-10-01T06:53:38 Muffi
Naja, wenn du ein Objekt hast und rufst in der Klasse die Methode do_something auf. Dann brauchst du einen Zeiger auf den Code (also wo liegt das do_something - oder besser wo liegt meine Klasse + Offset für do_something)


Ja schon. Aber deine Aussage war "Ansonsten braucht auch jedes andere Objekt jeder anderen (mir bekannten Sprache) einen Zeiger auf den Code und einen Zeiger auf die Daten." - und ein Zeiger auf die Daten braucht das Objekt selbst nicht. Jemand von außerhalb weiß, wo das Objekt liegt, es wird kein Selbstpointer im Objekt gespeichert. this ist kein "Member" der Klasse. Es ist in C++ noch nicht einmal garantiert, dass so eine Adresse überhaupt exisitert (z.B. wenn das Objekt in Register passt). (sobald du z.B. mit dem Adressoperator die Adresse abfragst, erzwingst du dann, dass das Objekt irgendwo im RAM sein muss).

Und der Zeiger auf den Code: gut, den speichert ja auch nicht das Objekt, sondern der Compiler kann anhand des Typs der Variablen ermitteln, welche Funktion aufgerufen wird. Erkläre, wie im obigen Beispiel sizeof(MyClass) sonst 1 sein könnte. Dieser Funktion muss dann der Speicherort des Objektes mitgegeben werden, richtig. Aber auch dieser Zeiger ist ja nicht im Objekt gespeichert, sondern zeigt auf das Objekt. Im Fall, dass die Funktion klein ist und geinlinet wird und der Optimierer gut arbeiten kann, kann es passieren, dass diese Pointer komplett wegfallen.

Sobald ich virtuelle Funktionen habe, wird es anders. Dann muss ich zur Laufzeit bestimmen, welche Funktion ich aufrufe. Das wird dann in der Tat mit einem Zeiger zu einer Tabelle realisiert, in welcher dann zu allen virtuellen Funktionen der passende Funktionspointer drin ist. Aber auch hier hat das Objekt nicht einen Pointer auf sich selbst. Die aufgerufene Funktion muss diesen Poiner allerdings übergeben bekommen. Es wird hier also erzwungen, dass das Objekt irgendwo im Speicher sein muss und mit einem Pointer referenziert werden kann.

Edit:
ist doch gar nicht so leicht, den Compiler zur Pointer-Benutzung zu überreden. Siehe Beispiel https://godbolt.org/z/WIaXsC
Last edited: 2019-10-01 12:57:42 +0200 (CEST)

View full thread Bitte um Hilfe bei bless Fehler