Bu tekniğin pratikte gerçekten kullanıldığını merak ediyorum. Her yerde mi yoksa dikkatle mi kullanmalıyım?
Tabii ki kullanılır. Projemde neredeyse her sınıfta kullanıyorum.
PIMPL deyimini kullanma nedenleri:
İkili uyumluluk
Bir kitaplık geliştirirken XImpl
, istemcinizle ikili uyumluluğu bozmadan alanlar ekleyebilir / değiştirebilirsiniz (çökmeler anlamına gelir!). X
Sınıfa yeni alanlar eklediğinizde sınıfın ikili düzeni değişmediğinden Ximpl
, küçük sürüm güncellemelerinde kitaplığa yeni işlevler eklemek güvenlidir.
Tabii ki, ikili uyumluluğu bozmadan X
/ XImpl
bozmadan yeni genel / özel sanal olmayan yöntemler de ekleyebilirsiniz , ancak bu standart başlık / uygulama tekniğiyle aynıdır.
Veri gizleme
Bir kitaplık, özellikle de tescilli bir kitaplık geliştiriyorsanız, kitaplığınızın genel arabirimini uygulamak için başka hangi kitaplıkların / uygulama tekniklerinin kullanıldığını açıklamak istenmeyebilir. Fikri Mülkiyet sorunları nedeniyle veya kullanıcıların uygulama hakkında tehlikeli varsayımlar almaya cazip gelebileceğine ya da sadece korkunç döküm hileleri kullanarak kapsüllemeyi kırabileceğine inandığınız için. PIMPL bunu çözer / azaltır.
Derleme zamanı
Sınıfa X
alanlar ve / veya yöntemler eklediğinizde / kaldırdığınızda XImpl
(standart teknikte özel alanların / yöntemlerin eklenmesiyle eşleşir ) yalnızca kaynak (uygulama) dosyasının yeniden oluşturulması gerektiğinden derleme süresi azalır . Uygulamada, bu yaygın bir işlemdir.
Standart üstbilgi / uygulama tekniğiyle (PIMPL olmadan), yeni bir alan eklediğinizde , ayırmanın boyutunu ayarlaması gerektiğinden, X
ayırdığı her istemcinin X
(yığın veya yığın üzerinde) yeniden derlenmesi gerekir. Eh, hiç X tahsis etmez her müşteri de yeniden derlenmesi gerekir, ancak (istemci tarafında çıkan kod aynı olacaktır) sadece havai var.
Dahası, standart üstbilgi / uygulama ayrımı XClient1.cpp
, özel bir yöntem X::foo()
eklendiğinde X
ve X.h
değiştirildiğinde bile yeniden derlenmelidir , ancak XClient1.cpp
kapsülleme nedenleriyle bu yöntemi çağıramazsınız! Yukarıdaki gibi, saf yük ve gerçek hayattaki C ++ yapı sistemlerinin nasıl çalıştığı ile ilgilidir.
Tabii ki, sadece yöntemlerin uygulamasını değiştirdiğinizde yeniden derlemeye gerek yoktur (çünkü başlığa dokunmazsınız), ancak bu standart başlık / uygulama tekniğiyle aynıdır.
Bu tekniğin gömülü sistemlerde kullanılması önerilir mi (performansın çok önemli olduğu yerlerde)?
Bu, hedefinizin ne kadar güçlü olduğuna bağlıdır. Ancak bu sorunun tek cevabı: ne kazandığınızı ve kaybettiğinizi ölçün ve değerlendirin. Ayrıca, müşterileriniz tarafından gömülü sistemlerde kullanılması amaçlanan bir kütüphane yayınlamıyorsanız, yalnızca derleme süresi avantajının geçerli olduğunu göz önünde bulundurun!
struct XImpl : public X
. Bu bana daha doğal geliyor. Kaçırdığım başka bir sorun var mı?