2014-10-02 2 views
9

boost :: variant кажется мощным контейнером для управления гетерогенным набором типов. Мне интересно его стоимость. В памяти, я думаю, он занимает размер самого большого типа плюс целое число, представляющее, что(). Для apply_visitor(), я думаю, что его производительность очень хорошая, она может вызывать непосредственно функцию, отличную от многих ifs. Правильно ли мои баллы?Что такое boost :: variant memory и производительность?

+0

Boost is opensource. Вы можете сделать небольшое исследование и просмотреть исходный код. Похоже, вы уже знаете, что искать. – Drop

+2

'apply_visitor' делает« много ifs »под капотом (на самом деле это больше похоже на (большой, метапрограммированный) переключатель типа (' which() ') варианта. Очевидно, что это просто минимальная требуемая работа.) – sehe

ответ

11

Вы почти правы.

Размер boost::variant это является размер макс любого элемента, закруглены по мере необходимости для наибольшего выравнивания, плюс размер некоторого целого, и снова округляется.

Подумайте о разновидностях этих типов, предполагая, что тег является uint32_t:

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

непомеченным союз должен иметь размер 16, выравнивание 8; добавление 4-байтовый тег должен идти до размера 24, чтобы держать Совместите 8.

Или рассмотрим вариант:

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

непомеченным союз они должны иметь размер 6, совместите 2; добавление 4-байтового тега вынуждает вас к размеру 12, выровняйте 4.

Для вызова, я ожидаю, что он использует поиск функций из массива (вот как я применил свой собственный вариант, который был необходим, поскольку boost не сделал конструкторы поддержки поддержки), поскольку, если цепи не работают хорошо, а переключатели невозможны.

Смежные вопросы