CodeBlanks Logo Icon CodeBlanks

ABI stability

ABI stability ve sürümleme öğrenirsin.

ABI stability

ABI stability, bir kütüphanenin yeni sürümünün eski derlenmiş kodla çalışmaya devam etmesidir. Sınıf boyutu, üye sırası, sanal fonksiyon tablosu gibi ikili ayrıntılar değişmemelidir.

ABI kırılgan noktaları: sınıfa yeni üye eklemek (boyut değişir), sanal fonksiyon eklemek (vtable değişir), üyelerin sırasını değiştirmek (yerleşim değişir), inline fonksiyonun gövdesini değiştirmek (uygulama dağıtılır). Qt, libstdc++ gibi kütüphaneler ABI'yi korumak için PIMPL ve d-pointer tekniklerini kullanır.

Sanal yıkıcı ilkesi

Bir sınıf virtual fonksiyon içeriyorsa yıkıcısı da virtual olmalıdır. Bu, türetilmiş sınıfın taban işaretçi üzerinden yok edildiğinde doğru yıkıcının çağrılmasını sağlar.

Örnek: class Base { public: virtual ~Base() = default; virtual int value() const { return 42; } };. Burada virtual ~Base() = default derleyicinin varsayılan yıkıcıyı sanal yapmasını ister. Bu ilkeyi izlersen ABI daha az kırılır; çünkü türetilmiş sınıflar güvenle yok edilir.

Uygulama Sanal yıkıcılı sınıf yaz

class Base yaz. Genel bölümünde virtual ~Base() = default; ve virtual int value() const { return 42; } olsun. main içinde Base b; std::cout << b.value(); yaz.

Başlangıç kodu

main.cpp
#include <iostream>

// Base sınıfını buraya tanımla

int main() {
    // Base örneği oluştur ve value'yu yazdır
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>

class Base {
public:
    virtual ~Base() = default;
    virtual int value() const {
        return 42;
    }
};

int main() {
    Base b;
    std::cout << b.value();
    return 0;
}

Beklenen çıktı

42

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 PIMPL işaretçisini tamamla

Soru
class Widget {
    struct Impl;
    std::unique_ptr<Impl> ____;
};
Cevap
class Widget {
    struct Impl;
    std::unique_ptr<Impl> pimpl;
};

Açıklama: pimpl işaretçisi Impl'nin tanımını gizler.

2 Tekniği rolüne eşle

Kavram Anlamı
PIMPL Gizli uygulama
virtual destructor Türetilmiş sınıf yok etme
#pragma pack Yapı hizalama
extern C Manglesiz sembol

3 Hangi değişiklik ABI'yi kırar?

main.cpp
class Base { public: virtual ~Base(); int x; };
  • Private üye eklemek
  • Yorum eklemek
  • Yeni sanal fonksiyon eklemek Doğru cevap
  • Fonksiyon adını değiştirmeden gövdesini değiştirmek

Açıklama: Yeni sanal fonksiyon vtable'ı değiştirir; eski kod yanlış fonksiyonu çağırır.

Uzman bölümündeki tüm dersler