SORU
19 EYLÜL 2008, Cuma


Virtual fonksiyonlar ve uygulanan taban?

Hepimiz sanal işlevler C ne olduğunu biliyorum , ama ne kadar derin bir düzeyde uygulanır?

Taban olarak veya doğrudan çalışma zamanında bile erişilebilir?

Taban tüm sınıflar için, ya da en az bir sanal işlevi olanlar var mı?

Soyut sınıflar sadece en az bir giriş fonksiyonu işaretçisi NULL var mı?

Yaptığı tek bir sanal işlev tüm sınıf yavaşlatmak zorunda? Ya da sanal bir işlev için tek diyorsun? Ve hızlı sanal işlevi aslında yazılır ya da etkilenmeyen olur mu, ya da bu hiçbir etkisi sanal olduğu sürece var.

CEVAP
19 EYLÜL 2008, Cuma


Virtual fonksiyonlar derin bir düzeyde uygulanır?

"Virtual Functions in C "

Bir program bir sanal işlev ilan etti zaman, v - tablo sınıfı için inşa edilmiştir. V-tablo bir veya daha fazla sanal fonksiyonları içeren sınıflar için sanal işlevlere olanak sağlar. Sınıf nesne sanal fonksiyon içeren bellek sanal tablo taban adresi işaret eden sanal bir işaretçi içerir. Sanal bir işlev çağrısı olduğunda, v-tablo işlevi adresine gidermek için kullanılır. Bir veya daha fazla sanal fonksiyonları içeren sınıfın bir nesnesi sanal bir işaretçi bellekte nesnenin en başta vptr denilen içerir. Dolayısıyla bu durumda nesnenin boyutunu işaretçisinin boyutunu artırır. Bu vptr bellekte sanal tablo temel adresini içerir. Sanal tablolar içerir sanal fonksiyonların sayısı ne olursa olsun bir sınıf için yalnızca bir sanal tablo var sınıf belli, yani, unutmayın. Bu da sanal tablo veya başka bir sanal fonksiyonlar taban adresleri içerir. Sanal bir işlev bir nesne üzerinde çağrıldığında zaman, o nesnenin vptr bellekte o sınıf için sanal tablo taban adresi sağlar. Bu tablo, bu sınıfın tüm sanal fonksiyonların adreslerini içerdiği gibi işlev çağrısı gidermek için kullanılır. Bu nasıl dinamik bağlama sanal işlev çağrısı sırasında çözümlenir.

Taban olarak veya doğrudan çalışma zamanında bile erişilebilir?

Evrensel olarak, sanırım yanıt "". hayır Bazı hafıza taban bulmak bozma yapabilirsin ama sen hala işlevini imza görünüyor onu aramak için nasıl bilmiyorum. Bu yetenek ile elde etmek istediğiniz bir şey dili destekleyen () taban erişim izni olmadan doğrudan veya zamanında değiştirilmesi gerekir. Ayrıca not, C dili specdeğildurumda fonksiyonun parametre değişkeni - ancak bunu nasıl çoğu derleyici sanal işlevleri uygulamak gerekli olduğunu belirtin.

Bu işlem tüm nesneler, ya da en azından bir sanal işlev yalnızca bu var mı?

Beninanıyorumcevap "uygulaması spec. durumda fonksiyonun parametre değişkeni gerektirmez" beri bağlıdır. Ancak, uygulamada, tüm modern Derleyiciler eğer bir sınıf en az 1 sanal işlevi varsa sadece bir taban oluşturmak inanıyorum. Uzay yükü taban ve zaman bir havai sanal bir işlev vs sanal olmayan bir işlev çağırma ile ilişkili vardır.

Soyut sınıflar sadece en az bir giriş fonksiyonu işaretçisi NULL var mı?

Cevap dil spec tarafından belirtilmemiş ise uygulanmasına bağlıdır. Saf sanal işlevi çağırmadan eğer tanımlı genelde değildir) (IEC 14882:2003 10.4-2 ISO/) ise tanımsız davranış oluşur. Pratikte işlevi için taban bir slot tahsis ediyor ama adresi atamaz. Bu türetilmiş sınıf işlevi uygulamak ve taban tamamlamak için gerektirir taban eksik bırakır. Bazı uygulamaları taban girdisinde BOŞ bir işaretçi yerleştirin basitçe; diğer uygulamaları bir bir onaylama benzer yapan kukla bir yöntem için bir işaretçi yerleştirmek.

Soyut bir sınıf saf sanal işlevi için bir uygulama olarak tanımlayan, ancak işlev sadece yetkili-ıd sözdizimi ile (örn., çağrılabilir unutmayın tam yöntem Adı Sınıf belirterek, türetilmiş bir sınıf bir temel sınıf yöntemi çağırmak için benzer). Bu hala türetilmiş bir sınıf geçersiz kılma sağlayan gerektiren süre varsayılan kullanımı kolay bir uygulama sağlamak için yapılır.

Yaptığı tek bir sanal işlev tüm sınıfın sanal işlevi için sadece arama yavaşlamak zorunda?

Bu benim bilgim kenarına geliyor, biri eğer yanılıyorsam lütfen bana yardımcı ol!

Beninanıyorumsınıf deneyimi sanal zaman performansı olan tek işlevleri sanal olmayan bir fonksiyonu vs sanal bir işlev çağırma ile ilgili çarptı. Sınıf için uzay yükü her iki şekilde de var. Eğer bir işlem varsa, sadece yüzde 1 olduğunu unutmayınsınıftek başına değilnesne.

Hızlı sanal işlevi aslında geçersiz olup olmadığını etkilenmiyor mu, ya da bu hiçbir etkisi sanal olduğu sürece var mı?

Temel sanal işlev çağrısının göre geçersiz azalır sanal bir fonksiyonun yürütme zamanı inanmıyorum. Ancak, sınıf türetilmiş sınıf vs için başka bir işlem tanımlama ile ilgili ek bir uzay yükü temel sınıf var.

Ek Kaynaklar:

http://www.codersource.net/published/view/325/virtual_functions_in.aspx (yol üzerinden geri makine)
http://en.wikipedia.org/wiki/Virtual_table
http://www.codesourcery.com/public/cxx-abi/abi.html#vtable

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chanre Joubert

    Chanre Joube

    27 Temmuz 2012
  • Elliot Davin

    Elliot Davin

    28 Kasım 2008
  • MovieZoneET

    MovieZoneET

    22 Aralık 2009