ABI stability
- C++ kursu
- Uzman
- Ders 23/47
- 5 dk
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
#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
#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
class Widget {
struct Impl;
std::unique_ptr<Impl> ____;
};
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?
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.