boost :: variant кажется мощным контейнером для управления гетерогенным набором типов. Мне интересно его стоимость. В памяти, я думаю, он занимает размер самого большого типа плюс целое число, представляющее, что(). Для apply_visitor(), я думаю, что его производительность очень хорошая, она может вызывать непосредственно функцию, отличную от многих ifs. Правильно ли мои баллы?Что такое boost :: variant memory и производительность?
ответ
Вы почти правы.
Размер 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 не сделал конструкторы поддержки поддержки), поскольку, если цепи не работают хорошо, а переключатели невозможны.
- 1. boost :: variant members подмножество другого boost :: variant
- 2. Что такое структура данных VARIANT?
- 3. boost :: variant и void * pointers
- 4. Итератор для boost :: variant
- 5. boost variant comparator
- 6. C++ Simple Variant Boost
- 7. Инкремент boost :: variant value
- 8. boost :: variant and polymorphism
- 9. Каковы различия между std :: variant и boost :: variant?
- 10. boost :: необязательная ссылка с boost :: variant type
- 11. QVariant vs boost :: any vs boost :: variant
- 12. Получить индекс boost :: variant с boost :: mpl
- 13. Должен ли я использовать boost :: variant?
- 14. boost :: variant; станд :: unique_ptr и копия
- 15. Полиморфный сеттер для Boost :: variant
- 16. boost :: variant of const и non-const
- 17. Извлечение объектов из boost :: variant
- 18. Рекомендация boost :: variant over union
- 19. Хранение классов в boost :: variant
- 20. Как правильно использовать boost :: variant?
- 21. Unmapping boost shared memory
- 22. boost :: variant - получить векторную характеристику членов
- 23. Boost: что такое «заголовок удобства»?
- 24. Что такое pthread в Boost?
- 25. Что такое утилита Boost Polygon?
- 26. Что такое boost :: дополнительная эффективность?
- 27. Что такое boost :: определение типа?
- 28. Что такое производительность PHP strtotime()?
- 29. Что такое String Local Memory в Java?
- 30. Что эквивалентно boost :: variant в стандартной библиотеке C++?
Boost is opensource. Вы можете сделать небольшое исследование и просмотреть исходный код. Похоже, вы уже знаете, что искать. – Drop
'apply_visitor' делает« много ifs »под капотом (на самом деле это больше похоже на (большой, метапрограммированный) переключатель типа (' which() ') варианта. Очевидно, что это просто минимальная требуемая работа.) – sehe