Wo sind Elementfunktionen für ein Objekt gespeichert?

8

Ich experimentiere mit C ++, um zu verstehen, wie Klassen / Strukturen und ihre jeweiligen Objekte im Speicher angeordnet sind, und ich habe verstanden, dass jedes Feld einer Klasse / Struktur ein Offset in ihr jeweiliges Objekt ist (also kann ich eine Elementvariable haben) Zeiger).

Ich verstehe nicht warum, auch wenn ich Memberfunktionszeiger haben kann, funktioniert folgender Code nicht:

%Vor%

Meine Frage ist: Warum funktioniert die Zeile

? %Vor%

compile und gibt mir den Offset des "c" -Feldes vom Anfang der Struktur und der Zeile

zurück %Vor%

kompiliert nicht sogar?

    
Johnny Pauling 22.03.2013, 14:10
quelle

2 Antworten

15

Elementfunktionen oder Zeiger auf sie sind nicht im Objekt gespeichert. ( virtual -Funktionen werden normalerweise über einen Zeiger aufgerufen, der in einer Tabelle gespeichert ist, auf die ein Objekt einen einzigen Zeiger hat). Dies wäre eine große Speicherverschwendung. Sie werden typischerweise in einem Code-Speicherabschnitt gespeichert und sind dem Compiler bekannt. Das Objekt ( *this ) wird normalerweise als unsichtbarer -Parameter übergeben, damit die Funktionen wissen, welches Objekt beim Aufruf aufgerufen werden soll.

Also, in der Laiensprache hättest du

%Vor%

und

%Vor%

Dabei ist a das Objekt, für das Sie foo aufrufen.

    
Luchian Grigore 22.03.2013, 14:14
quelle
2

Mitgliedsfunktionszeiger werden in der Praxis nicht in Objekten gespeichert: Es besteht keine Notwendigkeit. Der C ++ - Standard spezifiziert nicht genau, wie z. Virtuelle Funktionen sollen implementiert werden, aber die übliche Praxis für virtuelle Elementfunktionen ist, dass jedes Objekt einen Zeiger auf eine Tabelle von Funktionszeigern enthält; Dieser Zeiger wird als vtable Zeiger bezeichnet.

Sie könnten versuchen, "Inside das C ++ Objektmodell " von Stanley Lippman.

Oder Sie versuchen einfach, mein altes Tipps-Lernprogramm zu erhalten , die einmal aus dem Wikipedia-Artikel zitiert wurde, bevor meine damalige Homepage verschwand.

In Bezug auf die zweite Frage, warum die Adresse von p->memberFunc den Compiler ein wenig ersticken lässt, hat dieser Ausdruck keinen Typ, es ist nur eine syntaktische Entität , auf die Sie eine Argumentliste anwenden können um die Funktion aufzurufen.

Um es zu sagen,

%Vor%

Zusammenstellung:

%Vor%     
Cheers and hth. - Alf 22.03.2013 14:12
quelle