2014-10-02 21 views
9

boost :: variant, heterojen bir tür kümesini işlemek için güçlü bir kapsayıcı gibi görünüyor. Onun maliyetini merak ediyorum. Bellekte, en büyük türün boyutunu artıran bir tam sayıyı (b) temsil ettiğini düşünüyorum. Apply_visitor() için, performansının çok iyi olduğunu düşünüyorum, doğrudan birçok ifs dışındaki işlevi çağırabilir. Puanlarım doğru mu?Destek nedir? Değişken bellek ve performans maliyeti nedir?

+0

Boost açık kaynak kodudur. Biraz araştırma yapabilir ve kaynak kodlarına göz atabilirsiniz. Neye bakacağınızı zaten biliyorsunuz gibi görünüyor. – Drop

+2

"apply_visitor" başlık altında "çok sayıda ifs" yapar (aslında daha çok (büyük, meta programlanmış) bir varyantın türüne ('' ne() ') geçiş yapar, Açıkçası, bu sadece gereken minimum iştir.) – sehe

cevap

11

Haklısınız. en hizalama, artı bir miktar tamsayı boyutu için gerekli ve tekrar yuvarlanır

boost::variant boyutu olan herhangi bir elemanın maksimum boyutu, yuvarlanır.

etiketi varsayarak uint32_t olduğunu bu tür bir varyantı düşünün: Bir etiketsiz birlik, boyut 16 olması 8 hizaya gerekir

struct foo { uint32_t value[3]; }; // size 12, align 4 
struct bar { uint64_t v2; }; // size 8, align 8 

; 4 baytlık etiketi ekleyerek hizalayın 8.

tutmak Veya bir varyantını dikkate büyüklüğü 24 kadar gitmek gerekir: 2 hizaya bunlardan bir etiketsiz birliği boyutu 6 olması gerekir

struct foo { uint8_t value[5]; }; // size 5, align 1 
struct bar { uint16_t v2; }; // size 2, align 2 

; 4 baytlık etiketi eklediğinizde, boyutu 12'ye hizalarsınız, 4 hizalayın.

Arama için bir işlev dizisi araması kullanmasını beklerim (bu, kendi varyantımı nasıl uygulayacağımı gösterir. zincirleri iyi yapmazlarsa ve anahtarlar imkansızsa, destek taşıyıcıları desteklemek).

İlgili konular