Ответ
union — это составной тип данных в C++, все члены которого разделяют одну и ту же область памяти. Размер union равен размеру его наибольшего члена. В один момент времени union может содержать значение только одного из своих членов.
Основное применение: экономия памяти и низкоуровневая работа с данными (например, представление одних и тех же байтов разными типами).
#include <iostream>
union DataPacket {
int32_t asInt;
float asFloat;
uint8_t asBytes[4];
};
int main() {
DataPacket packet;
packet.asFloat = 3.14159f;
// Интерпретируем те же байты как целое число
std::cout << "Float value: " << packet.asFloat << std::endl;
std::cout << "Same bits as integer: 0x" << std::hex << packet.asInt << std::endl;
// Доступ к отдельным байтам
std::cout << "Bytes: ";
for (int i = 0; i < 4; ++i) {
std::cout << static_cast<int>(packet.asBytes[i]) << ' ';
}
std::cout << std::endl;
return 0;
}
Важные замечания:
- Активен только один член union. Чтение неактивного члена — это неопределенное поведение (UB).
- В современном C++ (C++11 и выше) рекомендуется использовать объединения с вариантом (variant unions), где можно явно отслеживать активный член, или стандартный класс
std::variant. - Часто используется в системном программировании, для работы с регистрами оборудования или разбора сетевых пакетов.