2013-07-27 4 views
14

Мне интересно, каковы различия между вариантом Boost и типом данных union в c/C++. Я знаю, что тип данных union занимает то же место в памяти, и самый большой тип данных в области памяти занимает общий объем используемой памяти, например.Boost Variant по существу Союз в c/C++?

union space { 
    char CHAR; 
    float FLOAT; 
    int INTEGER; 
}S; 

должен занимать 4 байта памяти, так как int и float являются самым крупным и одинаковым размером. Существуют ли сходства и различия между другими способами между Boost Variant и union типами данных? Я также знаю, что Boost Variant может принимать любые типы данных и позволяет использовать тип данных «полиморфизм» (исправьте меня, если я неправильно использую слово для темы ООП). Является ли тип данных объединения таким же типом полиморфизма?

ответ

11

Вариант Boost эмулирует объединение, но он не использует объединение в своей реализации. Вместо этого он использует выровненное хранилище и размещение нового.

Полиморфно в том смысле, что если вы примените объект-посетитель к варианту, он выберет правильную перегрузку для вас. Этот выбор должен выполняться во время выполнения, но объектный код для этого разворачивается во время компиляции. Так что это довольно быстро.

16

Основное отличие состоит в том, что Variant Boost знает, какой тип хранится в нем, поэтому вы не можете ошибаться или заставить UB неправильно использовать Variant так же, как вы можете объединить. Это также позволяет Variant принимать не-POD (т. Е. Действительно полезные) типы. Вариант также имеет несколько дополнительных трюков, таких как разрешение посетителей и рекурсивные варианты.

Лучшим руководством по использованию профсоюзов является «Не, потому что практически невозможно использовать их без использования UB». Это не относится к варианту, поэтому рекомендуется рекомендовать гораздо безопаснее.

+3

Что такое «UB» и «POD»? – pandoragami

+3

@ user2555139 Неопределенное поведение и обычные старые данные (типы) – Rapptz