Objektspeicherung und Member-Funktionszugriff in x86-Assembly verstehen
Objektspeicherung
In x86 In einer Assembly werden Objekte, einschließlich Strukturen und Klassen, als zusammenhängende Speicherblöcke gespeichert. Innerhalb dieser Blöcke werden die Mitgliedsvariablen der Reihe nach in der Reihenfolge angeordnet, in der sie deklariert wurden. Die Adresse jeder Mitgliedsvariablen erhöht sich, wenn der Block durchquert wird.
Member-Funktionszugriff
Member-Funktionen können über den This-Zeiger auf Objekte zugreifen. In Nicht-Member-Funktionen wird die Adresse des Objekts implizit als erstes Argument übergeben. Aufgrund des impliziten This-Zeigers ist dies jedoch bei Member-Funktionen nicht der Fall.
Der This-Zeiger zeigt auf den Anfang des Speicherblocks, in dem das Objekt gespeichert ist. Mit diesem Zeiger können Mitgliedsfunktionen direkt auf die Datenmitglieder des Objekts zugreifen und diese ändern.
Wenn wir beispielsweise eine Klasse namens foo mit den Mitgliedsvariablen m_a und m_b und eine Mitgliedsfunktion inc_a haben, die m_a, die Assembly, inkrementiert Code für inc_a könnte so aussehen:
foo::inc_a(): mov eax, DWORD PTR [rdi+4] # eax = this->m_a lea edx, [rax+1] # edx = eax + 1 mov DWORD PTR [rdi+4], edx # this->m_a = edx ret
Virtuelles Mitglied Funktionen
Bei Klassen mit virtuellen Memberfunktionen wird eine zusätzliche Indirektionsebene eingeführt. Jede Instanz der Klasse speichert einen Zeiger auf eine virtuelle Funktionstabelle (vtable). Die vtable enthält Zeiger auf die tatsächlichen Implementierungen der virtuellen Memberfunktionen.
Wenn eine virtuelle Memberfunktion aufgerufen wird, springt das Programm zunächst zum vtable-Eintrag für diese Funktion. Das Sprungziel ist die eigentliche Funktionsimplementierung, die dann ausgeführt wird.
Optimierung der Objektspeicherung
Während Objekte normalerweise im Speicher gespeichert werden, können sie auch in Registern gespeichert werden . Compiler können Code optimieren, um das Platzieren von Objekten im Speicher zu vermeiden, wenn sie während ihrer gesamten Verwendung in Registern gehalten werden können. Diese Optimierung ist möglich, wenn das Objekt klein genug ist, um in ein Register zu passen, und seine Mitglieder aktiv genutzt werden.
Beispielsweise reserviert eine Funktion, die eine kleine Struktur als Wert zurückgibt, möglicherweise keinen Speicher dafür. Stattdessen kann der Compiler die Mitglieder der Struktur in Register packen und sie direkt zurückgeben.
Das obige ist der detaillierte Inhalt vonWie greifen Mitgliedsfunktionen auf Objektdaten in der x86-Assembly zu und ändern sie?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!