C++ kodu, dynamic_cast
'u devre dışı bırakan çalışma zamanı türü bilgileri devre dışı bırakılarak derlenebilir. Ancak, sanal (polimorfik) yöntemlerin, hedefin çalışma zamanı tipine bağlı olarak gönderilmesi gerekir. Bu, tür bilgisinin zaten mevcut olduğunu ve dynamic_cast
'un her zaman çalışabilmesi anlamına gelmez mi?RTTI değil, yine de sanal yöntemler
cevap
RTTI'nın devre dışı bırakılması dynamic_cast
ve typeid
'u öldürür, ancak sanal işlevler üzerinde hiçbir etkisi yoktur. Sanal işlevler, sanal işlevlere sahip olan "vtable" sınıfları aracılığıyla gönderilir; Bir vtable sahip olmaktan kaçınmak istiyorsanız, sadece sanal işlevlere sahip olamazsınız. vahşi C++ kodunun
sürü dynamic_cast
olmadan çalışabilir ve hemen hemen her şeyi typeid
olmadan çalışabilir, ancak görece az sayıda C++ uygulamaları noktaya herhangi bir sanal işlevleri olmadan hayatta (veya daha fazla olacağını, işlevler olma sanal olması bekleniyor) sanal olmayan.
Sanal bir tablo (vtable), tüm sanal işlevler için her bir arama tipi için yalnızca örnek başına bir işaretçidir. Sadece kullandığınız şey için ödeme yaparsınız (Bjarne bu felsefeyi çok seviyor ve başlangıçta RTTI'ya direndi). Diğer yandan, tam RTTI ile, kütüphaneleriniz ve yürütücülerinizle, her türün adını ve belki de türler arasındaki hiyerarşik ilişkiler gibi diğer şeyleri tanımlamak için pişirilen çok fazla ayrıntılı dizeye ve diğer bilgilere sahip olursunuz.
RTTI'yi devre dışı bırakmanın, yürütücülerin boyutunu% 50 oranında küçülttüğü üretim sistemlerini gördüm. Bunların çoğu, şablonları büyük ölçüde kullanan bazı C++ programlarında yer alan büyük dize isimleri nedeniyle oldu.
Tamam, bu yüzden 'dynamic_cast' daha fazla bilgiye ihtiyaç duyar. Ancak, tipid'in hala işe yarayabileceği gibi, en azından bir vtable olan türler için işe yarayacaktır. Vtable işaretçisine C++ kodundan el ile erişilebilir mi? –
'typeid', ana amaçlarından biri her tür için bir ad sağlamak ve bu adların (gerçek boş sonlandırılmış dizeler) RTTI olmadan nesne dosyalarına gönderilmemesi olduğundan çalışamaz. Ve hayır, vtable C++ 'da taşınabilir bir şekilde manuel olarak erişilemez. Platforma özgü yollar olabilir, ancak bu nadir IMO'dur. –
Oh, beni korkut. :) Kontrol etmeden, "typeid" in bir çeşit oblik tam sayı/işaretçi döndürdüğünü varsaydım. Bir dize ise işe yaramayacağını düşünür (düzenleme: aslında 'class type_info'). –
- 1. Yine de Silverlight/XBAP
- 2. Sanal olmayan yöntemler nasıl yapılır?
- 3. Selenium WebDriverWait ama yine de "Eleman noktasında tıklanabilir değil"
- 4. RTTI
- 5. C# sanal (veya soyut) statik yöntemler
- 6. Delphi Sınıf Yardımcısı RTTI GetMethod
- 7. menü öğesi etkin, ancak yine de grileştirildi
- 8. Ruby'de Yöntemler: nesneler değil mi?
- 9. "Bu" işaretçisi RTTI etkin mi?
- 10. sanal özellikleri ve geç yükleme tanımı sanal özellikleri veya yöntemler ile
- 11. Xcode modülleri ayarlarında etkin, ama yine de, "Modülleri Enable" ayarlarında
- 12. İstisnaları yakalarım ama yine de günlükleri attığımı görüyorum
- 13. Kök ayrıcalıklarını düşürme ve yine de kümelenmeler oluşturmaya devam et
- 14. Neden yöntemler referans eşitliğine sahip değil?
- 15. Xcode proje dosyaları eksik - ancak yine de projede tanımlanmış
- 16. Github - Önemli Kimlik Doğrulama Başarısız - Yine de bağlanabiliyorum?
- 17. android izni iptal ettim, ama yine de selfsermermission
- 18. Dosyalar uygulamadan kaldırıldı, ancak yine de aynı alanı mı kullanıyorlar?
- 19. 'Composer self-update' nasıl yapılır, ancak yine de capistrano
- 20. Service.onDestroy(), oluşturulduktan sonra doğrudan çağrılır, Hizmet yine de çalışır.
- 21. nifty_generators gem yüklendi ama yine de jeneratörler kullanamazsınız
- 22. Ehcache sonsuza ayarlandı, ancak yine de öğeleri unuttun mu?
- 23. QWidget'in yıkıcısı neden sanal değil? qwidget.h baktığımızda
- 24. Delphi RTTI: Özellik sınıfını alın
- 25. RTTI Kullanarak Değişken Adı Al
- 26. Yöntemler
- 27. C# de yardımcı yöntemler: Statik mi yoksa statik olmayan mı?
- 28. Rastgele Dosya Jeneratör (yine!)
- 29. C# - Makinemin yerel IP Adresini bulma ve sanal makinenin değil
- 30. 2 koleksiyon arasındaki fark? (toplamadaki öğeler1, ancak koleksiyon2'de değil)
Tahminim, vtable'ın hala mevcut olduğu, ancak herhangi bir tip bilgisi içermediğinden (yalnızca işlev işaretçileri) sanal işlevler çalışmaya devam edecektir. –
Olası http://stackoverflow.com/questions/4486609/when-can-compiling-c-without-rtti-cause-problems kopyası ...? –
Dinamik_cast'in çalışabilmesi için (birden fazla kalıtımı olan karmaşık durumlarda) sanal işlev tablolarından daha fazlasına ihtiyacınız vardır – marom