Virtual Function'lar: Polymorphism Nasıl Çalışıyor ve Maliyeti Nedir?
# Virtual Function'lar: Polymorphism Nasıl Çalışıyor ve Maliyeti Nedir?
Polymorphism, bir pointer veya referans üzerinden farklı türlerin aynı fonksiyonunu çağırabilmektir. Örneğin `Animal` türündeki pointer, `Dog` veya `Cat` nesnesine işaret edebilir ve her birinin kendi `sound()` fonksiyonu çalışır.
Bir sınıfta `virtual` anahtar kelimesi kullanırsanız, C++ derleyicisi o sınıfa gizli bir vtable (virtual method table) ekler. Bu tablo, her virtual fonksiyonun gerçek adresini tutar.
Çalışma süresi (runtime) sırasında pointer türüne bakılmaz; nesnenin gerçek türü kontrol edilir ve vtable'dan doğru fonksiyon bulunup çağrılır.
1#include <iostream>2using namespace std;34class Animal {5public:6virtual void sound() {7cout << "Bilinmeyen ses" << endl;8}9virtual ~Animal() {}10};1112class Dog: public Animal {13public:14void sound() override {15cout << "Hav hav!" << endl;16}17};1819class Cat: public Animal {20public:21void sound() override {22cout << "Miyav!" << endl;23}24};2526int main() {27Dog dog;28Cat cat;2930Animal* animals[2] = {&dog, &cat};3132for (int i = 0; i < 2; i++) {33animals[i]->sound();34}3536return 0;37}Çıktı:
1Hav hav!2Miyav!Vtable Arama: Her virtual fonksiyon çağrısında, vtable'dan doğru adres bulunması gerekir. Bu, doğrudan fonksiyon çağrısından 1-2 nanosaniye daha yavaştır.
Bellek Kullanımı: Virtual fonksiyon içeren her nesne, 8 baytlık vtable pointer taşır. Binlerce nesne varsa bu fark görülür.
Inline Edilemez: Derleyici, virtual fonksiyonları compile time'da inline edemez çünkü hangi fonksiyonun çalışacağı runtime'da belli olur.
Polymorphism gerekli olduğunda kullan. Eğer `Animal*` pointer'ı ile farklı hayvan türlerini yöneteceksen, virtual fonksiyon şarttır. Ama performans kritik koda (örneğin oyun loop'u) vtable araması eklemek istiyorsan, template kullan.
Özetle: Virtual function'lar esneklik sağlar ama maliyeti vardır. Doğru yerde doğru araç seç.
0 yorum