Перейти до вмісту

C++/Основи/Об'єднання (union)

Матеріал з Вікіпідручника
< C++

Об'єднання (union)

[ред.]

union це ключове слово, що використовується для визначення типу об'єднання (union).

Синтаксис
    union union-name 
    {
        public-members-list; // список публічних членів
    private:
        private-members-list; // список прихованих членів
    } object-list;

Таке сполучення чи об'єднання полів подібне до структури struct (більш ніж до класу class), але відрізняється тим, що поля даного union поділяють одну і ту саму позицію в пам'яті, і за замовчуванням мають модифікатор видимості public, а не private. union має розмір, що відповідає розміру його найбільшого поля (або більше якщо так потребує вирівнювання, наприклад на машинах SPARC архітектури, якщо union містить double і char [17] його розмір скоріш за все становитиме 24, бо необхідно виконати 64-бітне вирівнювання). Сполучення не можуть мати деструкторів destructor.

Який в тому сенс? Сполучення дозволяють забезпечити декілька способів представлення одного місця у пам'яті, що дозволяє ефективніше використовувати пам'ять. Більшість сценаріїв використання типу union в C++ вирішуються функціями об'єктно-орієнтованого програмування, тому зараз вони більш поширені при програмуванні мовою C. Однак, іноді зручно уникнути формальностей об'єктно-орієнтованого програмування, коли важливою є швидкодія програми або відомо наперед, що цей елемент коду не буде змінюватися.

     union Data {
       int i;
       char c;
     };

Запис різних байтів даних

[ред.]

Об'єднання корисні в задачах низькорівневого програмування, що стосуються запису в одну і ту саму ділянку пам'яті, але різних порцій даних в виділеному відрізку даних, наприклад:

union item 
{
  // елемент має довжину в 16-біт
  short theItem;

  // в представленні little-endian lo доступається до молодших 8-біт -
  // hi, до верхніх 8-біт
  struct { char lo; char hi; } portions;
};

Назва структури, що оголошена у полі може бути опущена, бо вона не використовується. Все що має бути явно назване, це частини, до яких ми маємо намір здійснювати доступ, тобто сам екземпляр структури, portions.

  item tItem;
  tItem.theItem = 0xBEAD;
  tItem.portions.lo = 0xEF; // елемент тепер дорівнює 0xBEEF

Використовуючи цю структуру ми можемо модифікувати старші і молодші байти поля theItem, без втручання у інші байти даних.