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". Это не относится к варианту, поэтому гораздо безопаснее рекомендовать.