Struktur dan kelas, blok binaan objek, disimpan dalam ingatan sebagai blok bersebelahan. Walau bagaimanapun, susun atur memori sebenar dan akses fungsi ahli berbeza-beza bergantung pada kehadiran fungsi maya.
Struktur adalah serupa dengan struct dalam C, tetapi dalam C , ia adalah setara dengan kelas dengan ahli awam sebagai lalai. Ia disimpan sebagai bait berturut-turut, dengan alamat ahli meningkat mengikut susunan pengisytiharan mereka.
Sebagai contoh, struct berikut:
struct MyStruct { int a; float b; char c; };
Akan disimpan dalam ingatan sebagai:
+---+---+---+ | a | b | c | +---+---+---+
Untuk mengakses fungsi ahli, pengkompil menjana arahan yang memuatkan alamat objek ke dalam daftar (biasanya ini) dan kemudian gunakan offset untuk mengambil alamat ahli tertentu.
Kelas berbeza daripada struct apabila mereka mempunyai fungsi ahli maya. Untuk menampung ini, penunjuk tambahan, dipanggil penunjuk vtable, disimpan sebagai ahli pertama. Penunjuk ini menunjuk ke jadual fungsi yang mengandungi alamat untuk fungsi maya.
Apabila fungsi maya dipanggil, penuding vtable digunakan untuk mendapatkan semula alamat fungsi yang sesuai. Ini membolehkan objek mempunyai pelaksanaan fungsi maya yang berbeza berdasarkan jenis dinamiknya.
Sebagai contoh, pertimbangkan hierarki kelas berikut:
class Animal { public: virtual void speak(); }; class Dog : public Animal { public: void speak() override { cout << "Woof!"; } }; class Cat : public Animal { public: void speak() override { cout << "Meow!"; } };
Objek Haiwan akan disimpan dalam ingatan sebagai:
+---+---+ | vtable | a | +---+---+
di mana vtable menunjuk ke jadual yang mengandungi penunjuk fungsi untuk speak() dalam semua terbitan kelas.
Penyusun boleh mengoptimumkan pengendalian objek dalam pelbagai cara, termasuk fungsi ahli sebaris. Contohnya, fungsi sebaris ringkas yang mengembalikan struct boleh dioptimumkan sepenuhnya, memastikan semua ahli dalam daftar dan melangkau peruntukan memori.
Ringkasnya, objek dalam pemasangan x86 disimpan dalam ingatan sebagai blok bersebelahan, dengan akses ahli dipermudahkan melalui offset dalam struct atau jadual fungsi maya dalam kelas. Penyusun menggunakan pengoptimuman untuk meningkatkan prestasi, termasuk menyelaraskan fungsi ahli dan menyimpan struktur kecil dalam daftar.
Atas ialah kandungan terperinci Bagaimanakah Fungsi Maya Mempengaruhi Penyimpanan Objek dan Akses Ahli dalam Perhimpunan x86?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!