2015-12-18 21 views
13

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

+1

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. –

+1

Olası http://stackoverflow.com/questions/4486609/when-can-compiling-c-without-rtti-cause-problems kopyası ...? –

+0

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

cevap

13

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.

+0

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? –

+0

'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. –

+0

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'). –

İlgili konular