Урок 17: union и его отличие от struct
struct даёт каждому полю собственную память — но в C есть и его бережливый близнец: union. В union все члены разделяют одну и ту же область памяти, поэтому в любой момент 'жив' только один из них. union Value { int i; double d; }; занимает размер своего наибольшего члена (8 байт для double), тогда к
struct — это квартира с комнатой для каждого жильца; union — это одна комната с одной кроватью: когда въезжает новый жилец, предыдущего просто выгоняют. В любой момент там живёт ровно один.
- union
- Тип, все члены которого разделяют одну и ту же область памяти — в каждый момент действителен только один член.
- общая память (перекрытие)
- Все члены union начинаются с одного и того же адреса; запись в один перезаписывает биты остальных.
- sizeof для union
- Размер наибольшего члена. В struct, напротив, — примерно сумма членов, иногда больше из-за выравнивания (padding).
- выравнивание (padding)
- Пустые байты, которые компилятор добавляет в struct, чтобы выровнять поля в памяти — поэтому sizeof иногда больше суммы полей.
- тег типа
- Сопутствующее поле (int или enum), хранимое рядом с union, чтобы помнить, какой член сейчас действителен.