Saya akan menebak:
Konstruktor dan destruktor C ++ sama sekali tidak berfungsi: semuanya makro. Mereka masuk ke dalam ruang lingkup di mana objek dibuat, dan ruang lingkup di mana objek dihancurkan. Pada gilirannya, tidak ada konstruktor atau destruktor, objek hanya IS.
Sebenarnya, saya pikir fungsi-fungsi lain di dalam kelas juga bukan fungsi, tetapi fungsi sebaris yang DONT dapatkan sebaris karena Anda mengambil alamatnya (kompiler menyadari Anda ke dalamnya dan tidak inline atau inline kode ke dalam fungsi dan mengoptimalkan fungsi itu) dan pada gilirannya fungsi tersebut tampaknya "masih ada", meskipun tidak jika Anda belum mengatasinya.
Tabel virtual "objek" C ++ tidak seperti objek JavaScript, di mana Anda bisa mendapatkan konstruktornya dan membuat objek darinya saat runtime via new XMLHttpRequest.constructor
, melainkan kumpulan pointer ke fungsi anonim yang bertindak sebagai alat untuk berinteraksi dengan objek ini , tidak termasuk kemampuan untuk membuat objek. Dan itu bahkan tidak masuk akal untuk "menghapus" objek, karena itu seperti mencoba untuk menghapus struct, Anda tidak bisa: itu hanya label tumpukan, hanya menulis kepadanya sesuka Anda di bawah label lain: Anda bebas untuk gunakan kelas sebagai 4 bilangan bulat:
/* i imagine this string gets compiled into a struct, one of which's members happens to be a const char * which is initialized to exactly your string: no function calls are made during construction. */
std::string a = "hello, world";
int *myInt = (int *)(*((void **)&a));
myInt[0] = 3;
myInt[1] = 9;
myInt[2] = 20;
myInt[3] = 300;
Tidak ada kebocoran memori, tidak ada masalah, kecuali Anda secara efektif membuang banyak ruang stack yang disediakan untuk antarmuka objek dan string, tetapi itu tidak akan merusak program Anda (selama Anda tidak mencoba menggunakannya) sebagai string lagi).
Sebenarnya, jika asumsi saya sebelumnya benar: biaya lengkap string hanyalah biaya menyimpan 32 byte ini dan ruang string konstan: fungsi hanya digunakan pada waktu kompilasi, dan mungkin juga bisa digarisbawahi dan dibuang setelah objek dibuat dan digunakan (Seolah-olah Anda bekerja dengan struct dan hanya merujuk secara langsung tanpa panggilan fungsi, tentu ada panggilan duplikat alih-alih fungsi melompat, tetapi ini biasanya lebih cepat dan menggunakan lebih sedikit ruang). Intinya, setiap kali Anda memanggil fungsi apa pun, kompiler hanya mengganti panggilan itu dengan instruksi untuk benar-benar melakukannya, dengan pengecualian yang telah ditetapkan oleh perancang bahasa.
Ringkasan: objek C ++ tidak tahu apa itu; semua alat untuk berinteraksi dengan mereka diuraikan secara statis, dan hilang saat runtime. Ini membuat bekerja dengan kelas seefisien mengisi struct dengan data, dan langsung bekerja dengan data itu tanpa memanggil fungsi apa pun (fungsi-fungsi ini diuraikan).
Ini benar-benar berbeda dari pendekatan COM / ObjectiveC serta javascript, yang mempertahankan jenis informasi secara dinamis, dengan biaya runtime overhead, manajemen memori, panggilan konstruksi, karena kompiler tidak dapat membuang informasi ini: diperlukan untuk pengiriman dinamis. Ini pada gilirannya memberi kita kemampuan untuk "Bicara" ke program kami saat runtime, dan mengembangkannya saat sedang berjalan dengan memiliki komponen yang dapat dipantulkan.