Boost Variant по существу является Союзом в c/С++?
Мне интересно, каковы различия между вариантом Boost и типом данных union
в c/С++. Я знаю, что тип данных union
занимает одну и ту же ячейку памяти, а самый большой тип данных в области памяти занимает общий объем используемой памяти, например.
union space {
char CHAR;
float FLOAT;
int INTEGER;
}S;
должен занимать 4 байта памяти, так как int
и float
являются наибольшим и равным размером. Существуют ли сходства и различия между другими способами между версиями Boost Variant и union
?
Я также знаю, что вариант Boost может принимать любой тип данных и позволяет использовать тип данных "полиморфизм" (исправьте меня, если я злоупотребляю текстовым словом ООП). Является ли тип данных объединения таким же типом полиморфизма?
Ответы
Ответ 1
Вариант Boost эмулирует объединение, но он не использует объединение в своей реализации. Вместо этого он использует выровненное хранилище и размещение нового.
Полиморфно в том смысле, что если вы примените объект-посетитель к варианту, он выберет правильную перегрузку для вас. Этот выбор должен выполняться во время выполнения, но объектный код для этого разворачивается во время компиляции. Так что это довольно быстро.
Ответ 2
Основное различие заключается в том, что Boost Variant знает, какой тип хранится в нем, поэтому вы не можете ошибаться или получить UB от неправильного использования Variant так же, как вы можете объединить. Это также позволяет Variant принимать не-POD (т.е. Действительно полезные) типы. Вариант также имеет несколько дополнительных трюков, таких как разрешение посетителей и рекурсивные варианты.
Лучшим руководством по использованию профсоюзов является "Не, потому что практически невозможно использовать их без использования UB". Это не относится к варианту, поэтому гораздо безопаснее рекомендовать.