POD (Plain Old Data), C++'da C dilindeki normal veri yapılandırmasıyla uyumlu olan ve düşük seviyeli programlama için mükemmel olan bir yapı veya veri türüdür.
Konuya Giriş:
POD, C ve C++ arasında bellek uyumluluğunu sağlamak amacıyla C dilinden miras kalmış bir kavramdır. C++98'de POD nesneleri, bayt bayt kopyalanabilir veya doğrudan serileştirilebilir olmaları için katı sınırlamalara sahipti.
Sorun:
Birçok programcı, POD'u sadece basit yapılarla karıştırarak standartta yer alan ayrıntıları göz ardı etmekte; örneğin, birleştirme kurallarını veya standart dışı yapıcıların varlığını dikkate almamakta ki bu durum ABI uyumluluğu ve düşük seviyeli işlemlerde (memcpy, serileştirme) kritik öneme sahiptir.
Çözüm:
Modern C++'da C++11 ile trivial, trivially copyable ve standard-layout kavramları tanıtılarak gereksinimler daha net bir şekilde ayrılmıştır.
Kod örneği:
struct PODType { int x; double y; }; static_assert(std::is_pod<PODType>::value, "POD olmalı"); static_assert(std::is_trivially_copyable<PODType>::value, "Trivially copyable"); static_assert(std::is_standard_layout<PODType>::value, "Standard layout");
Ana özellikleri:
Özel üyeler ile bir POD türü oluşturmak mümkün mü?
Hayır, standard-layout ya tüm üyelerin public olmasını ya da homojen erişimi (ya hepsi public ya da hepsi private/protected) gerektirir.
Eğer içinde açıkça tanımlanmış bir kullanıcı yapıcısı olmayan bir sınıf varsa, bu POD türü olur mu?
Hayır, kullanıcı yapıcısının (boş bile olsa) varlığı, türü POD ve trivially olamaz hale getirir.
POD türünü sanal yıkıcı veya sanal fonksiyonlarla kullanabilir miyim?
Hayır, sanal yöntemler türü POD ve standard-layout olamaz hale getirir.
Negatif Durum
Bir geliştirici, memcpy ile bir yapıyı serileştirir ve içinde std::string (POD değil) olduğunu fark etmediği için okuma işlemleri sırasında veriler hatalı olur.
Artılar:
Eksiler:
Pozitif Durum
Bütün yapı – POD veya trival, serileştirme – memcpy ile, içinde hiç referans ya da std-konteyner yoktur.
Artılar:
Eksiler: