SORU
23 ŞUBAT 2009, PAZARTESİ


Nasıl pahalı RTTI?

Kaynak RTTI kullanarak vurmak olduğunu anlıyorum, ama ne kadar büyük? Sadece baktım her yerde "RTTI pahalı, aslında herhangi bir kriterler veya sayısal veri vermek yok" ama bellek, işlemci zamanı, hız reguarding.

Ne kadar pahalı RTTI? Her sayı önemli yani sadece RAM 4 MB var nerede gömülü bir sistem üzerinde kullanmak olabilir.

Edit:* *26, aslında ne aradığımı ben de dahil ederseniz daha iyi olur. Bunu yapmak zor sadece sanal fonksiyonları kullanarak olur I am using a class to pass in data of different lengths and that can perform different actions,. dynamic_castbir kaç s kullanarak farklı türetilmiş sınıfları farklı düzeylerde yoluyla aktarılabilir ama yine de onları tamamen farklı hareket için izin vererek bu sorunu çözmek olabilir gibi görünüyor.

Benim anlayış, dynamic_cast RTTI kullanır, bu yüzden sınırlı bir sistem üzerinde kullanmak için ne kadar zor olacağını merak ediyordum.

CEVAP
2 Aralık 2010, PERŞEMBE


Derleyici ne olursa olsun, her zaman eğer bunu göze eğer zamanı kaydedebilirsiniz

if (typeid(a) == typeid(b)) {
  B* ba = static_cast<B*>(&a);
  etc;
}

yerine

B* ba = dynamic_cast<B*>(&a);
if (ba) {
  etc;
}

Eski std::type_info; ikincisi yalnızca bir karşılaştırma içerir miras bir ağaç plus karşılaştırmalar geçme içerir mutlaka.

Herkesin dediği gibi o son..., kaynak kullanımı uygulama özeldir.

Sunana tasarım nedenlerden dolayı RTTI kaçınmalısınız herkesin yorumlarına katılıyorum. Ancak, oradaRTTI kullanmak için iyi nedenler (özellikle boost yüzünden::). Unutmayın, yararlı ortak uygulamalarında gerçek kaynak kullanımı.

Geçenlerde GCC RTTI araştırmalar bir sürü yaptı.

tl;dr: birçok platformda (), BSD ve belki de gömülü platform Linux ama mingw32 üzerinde ihmal edilebilir bir boşluk ve typeid(a) == typeid(b) çok hızlı GCC kullanır RTTI,. Eğer her zaman kutsal bir platform olacak biliyorsanız, RTTI ücretsiz çok yakındır.

Cesur ayrıntılar:

GCC özellikle kullanmayı tercih ediyor "satıcı-nötr" C ABİ[1], ve Linux ve BSD hedefleri[2] Bu ABİ her zaman kullanır. Ve ayrıca ABİ bu zayıf bağlantı destekleyen platformlar, typeid() verir hatta dinamik bağlama sınırlarında her türü için tutarlı ve benzersiz bir nesne. &typeid(a) == &typeid(b) ya da sadece taşınabilir test typeid(a) == typeid(b) sadece bir işaretçi içten farkı nedir aslında gerçeği güveniyor test edebilirsiniz.

GCC tercih edilen ABİ, bir sınıf tabanher zamankullanılan olmayabilir ama her tür RTTI bir yapı için bir işaretçi tutar. typeid() Bir ara kendisigerekirbaşka bir işlem arama (sanal üye arama ile aynı fonksiyon) ve RTTI desteği kadar maliyet sadeceolmamalıher nesne için herhangi bir ekstra boşluk kullanın.

Anladığım kadarıyla, RTTI yapıları GCC (bu std::type_info tüm alt sınıfları) tarafından kullanılan her tür için bir kaç bayt, bir kenara adından tutun. İsimleri -fno-rtti hatta çıkış kodu mevcut olup olmadığını bana açık değildir. Her iki şekilde de, derlenmiş ikili dosya boyutu değişim zamanı bellek kullanımı değişiklikleri yansıtmak gerekir.

Hızlı bir deneme (Ubuntu 10.04 64-bit GCC 4.4.3 kullanarak) -fno-rtti aslında gösterirartırırbir kaç yüz kişi tarafından basit bir test programı ikili bayt boyutudur. Bu sürekli -g -O3 kombinasyonları arasında gerçekleşir. Boyutunu artırmak neden emin değilim; bir ihtimal gds'ler STL kodu farklı RTTI istisnalar işe yaramaz beri) olmadan davranır.

[1] Tabanlı C ABİ olarak Bilinen, http://www.codesourcery.com/public/cxx-abi/abi.html belgelenmiş. Adları korkunç kafa karıştırıcı: adı ABİ belirtimi i686/x86_64 mimarileri de dahil olmak üzere çok sayıda üzerinde çalışır, ancak özgün geliştirme mimarisi anlamına gelir. GCC iç kaynak ve STL kodu açıklamaları """ önce kullandılar. "eski aksine ABİ yeni olarak Alınmıyor bakın Daha da kötüsü, "yeni"/Alınmıyor ABİ ifade edertümsürümleri -fabi-version; ile kullanılabilir "eski" ABİ bu sürüm daha önce oldu. GCC/sürüm bilgisi/Tabanlı"3.0;" ABİ 2.95 ve daha önce kullanılmış, eğer onların değişiklikleri yükleyin okuyorum doğru. "eski sürüm" ABİ yeni kabul edilen

[2] herhangi bir kaynak std::type_info platform tarafından istikrar nesne listesi bulamadım. Eskiden ben aşağıdaki erişimi vardı Derleyiciler için: echo "#include <typeinfo>" | gcc -E -dM -x c -c - | grep GXX_MERGED_TYPEINFO_NAMES. Bu makro gds'ler STL std::type_info operator== davranış, GCC 3.0 olarak kontrol eder. Mingw32-gcc itaat Windows C std::type_info nesneleri DLL altında strcmp çağrıları bir türü için benzersiz değil ABİ, kapsayan buldum. Tek programına karşı bağlantı için kod yok nerede AVR gibi gömülü hedefler std::type_info nesneleri her zaman kararlı olduğunu spekülasyon.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Washington

    Adam Washing

    12 Mayıs 2006
  • CMTelly

    CMTelly

    2 Mayıs 2007
  • TechRax

    TechRax

    21 EYLÜL 2009