Vahşi bir tahmin yapacağım:
C ++ yapıcısı ve yıkıcısı işlev değildir: makrolardır. Nesnenin oluşturulduğu kapsama ve nesnenin yok edildiği kapsama girerler. Buna karşılık, hiçbir kurucu ya da yıkıcı yoktur, nesne sadece IS'dir.
Aslında, sınıftaki diğer işlevlerin işlevler olmadığını düşünüyorum, ancak adresleri aldığınız için DONT'un satır içi işlevlerini satır içi işlevler aldınız (derleyici, bunun üzerine geldiğinizi fark eder ve kodu satır içine almaz veya işlevin içine yerleştirmez ve bu işlevi optimize eder) ve bunun yerine adres almamış olsanız bile işlev "hala orada" gibi görünür.
C ++ "nesnesinin" sanal tablosu, bir JavaScript nesnesi gibi değildir, burada onun yapıcısını alabilir ve çalışma zamanında ondan nesne oluşturabilirsiniz new XMLHttpRequest.constructor
, bunun yerine bu nesneyle arabirim aracı olarak işlev gören anonim işlevlere işaretçiler koleksiyonu , nesne oluşturma yeteneği hariç. Ve nesneyi "silmek" bile mantıklı değil, çünkü bir yapıyı silmeye çalışmak gibi, yapamazsınız: bu sadece bir yığın etiketi, sadece başka bir etiketin altında istediğiniz gibi yazabilirsiniz: 4 tamsayı olarak bir sınıf kullanın:
/* 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;
Bellek sızıntısı yok, sorun yok, ancak nesne arabirimi ve dize için ayrılmış bir yığın yığın alanını etkili bir şekilde boşa harcamanız dışında, ancak programınızı yok etmeyecek (kullanmaya çalışmadığınız sürece) bir daha dize olarak).
Aslında, daha önceki varsayımlarım doğruysa: dizenin tam maliyeti sadece bu 32 baytı ve sabit dize alanını depolama maliyetidir: işlevler sadece derleme zamanında kullanılır ve sonra da satır içine alınabilir ve atılabilir nesne oluşturulur ve kullanılır (Bir yapı ile çalışıyor ve yalnızca herhangi bir işlev çağrısı olmadan doğrudan başvuruyorsunuz gibi, işlev atlamaları yerine yinelenen çağrılar olduğundan emin olun, ancak bu genellikle daha hızlıdır ve daha az alan kullanır). Özünde, herhangi bir işlevi çağırdığınızda, derleyici, dil tasarımcılarının belirlediği istisnalar dışında, bu çağrıyı kelimenin tam anlamıyla yapma talimatlarıyla değiştirir.
Özet: C ++ nesnelerinin ne oldukları hakkında hiçbir fikri yoktur; onlarla arabirim oluşturmak için tüm araçlar statik olarak satır içine alınır ve çalışma zamanında kaybolur. Bu, sınıflarla çalışmayı yapıları verilerle doldurmak kadar verimli hale getirir ve herhangi bir işlev çağırmadan bu verilerle doğrudan çalışır (bu işlevler satır içine alınır).
Bu, COM / ObjectiveC'nin yanı sıra tür bilgilerini dinamik olarak, çalışma zamanı yükü, bellek yönetimi, inşaat çağrıları pahasına, derleyici bu bilgileri atmayacağı için javascript yaklaşımlarından tamamen farklıdır: dinamik dağıtım için. Bu da bize programımızda çalışma zamanında "Konuşma" yapma ve yansıtılabilir bileşenlere sahip olarak çalışırken geliştirme becerisi kazandırır.