Memahami Penyimpanan Objek dalam Himpunan (x86)
Dalam pemasangan x86, objek disimpan sebagai blok memori bersebelahan. Mereka tidak dikaitkan secara semula jadi dengan kelas seperti dalam bahasa peringkat tinggi; sebaliknya, ia hanyalah bahagian bait yang boleh dimanipulasi oleh atur cara.
Storan Struktur dan Kelas
Struktur dan kelas disimpan secara sama, kecuali kelas dengan ahli maya mempunyai "vtable" tersirat ditambah sebagai elemen pertama. Vtable ini mengandungi penunjuk kepada setiap pelaksanaan fungsi maya, membenarkan pengikatan dinamik.
Akses Fungsi Ahli
Fungsi ahli diakses melalui penuding "ini" tersirat, iaitu diluluskan sebagai hujah pertama kepada fungsi tersebut. Penunjuk ini menunjuk ke objek yang ahlinya sedang diakses.
Penghantaran Fungsi Maya
Apabila fungsi maya dipanggil, pengkompil menyemak vtable objek untuk menentukan yang betul pelaksanaan fungsi. Tingkah laku dinamik ini membenarkan tingkah laku polimorfik di mana kelas terbitan berbeza boleh mengatasi fungsi maya kelas asas.
Pengoptimuman Daftar
Pengkompil boleh memilih untuk mengoptimumkan peruntukan memori untuk struct , terutamanya untuk struktur kecil atau pembolehubah tempatan. Ia boleh menyimpan ahli struct dalam daftar CPU, menghapuskan keperluan untuk akses memori.
Contoh
Pertimbangkan kod berikut:
struct foo { int m_a; int m_b; void inc_a() { m_a++; } void inc_b() { m_b++; } };
Kod pemasangan untuk fungsi inc_b ialah:
foo::inc_b(): mov eax, DWORD PTR [rdi+4] # eax = this->m_b lea edx, [rax+1] # edx = eax+1 mov DWORD PTR [rdi+4], edx # this->m_b = edx ret
Dalam kod ini, penunjuk "ini" tersirat dihantar dalam daftar rdi dan nilai disimpan 4 bait di dalam objek, seperti yang ditentukan oleh penyusun.
Atas ialah kandungan terperinci Bagaimanakah Objek Disimpan dan Diakses dalam Perhimpunan x86?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!