технологія об'єднаньunion бере свої витоки в 90-х. Слабкі на наші часи ЕОМ (Зараз їх і комп'ютерами то не назвеш), мало пам'яті(все вимірювалося кілобайтами). Жорсткі диски по 40 мегабайт були мало не дивом техніки, втілює огроменние обсяги інформації, які умільцями “розточуються” спеціальними ПО до зберігання 80 мегабайт (щоб побільше було).
Кожен байт пам'яті був на вагу золота, доводилося економити на всьому. Ось і об'єднання змінних теж було покликане (і досить успішно, про що я розповім нижче) допомогти програмісту створити оптимальну і економну програму, “куша” маленькі обсяги пам'яті.
Щоб зрозуміти в чому сенс об'єднання потрібно згадати як зберігаються змінні.Різні змінні різного типу або однаковою групи типів (начебто int, long і short) незважаючи на роботу з одним і тим же типом даних (маю на увазі ціле) займають в пам'яті різну кількість байт.long в будь-якому випадку займає максимальну кількість байт в пам'яті, при цьому в пам'ять для змінної цього типу цілком можна записати значення int или short.
просто вийде, що не всі зарезервовані байти long-а будуть затребувані. Якщо помістити наприклад число 325 в long, будуть зайняті два байта (залежить від розрядності процесора), а іншібайти заповняться нулями.
Саме в цьому і з'являється сенс union, бо ця інструкція говорить компілятору: “Зарезервуйте мені місце для типу даних з максимальним запитом обсягу пам'яті, а я вже буду сама розбиратися, як і які значення в них покласти”.
об'єднання – це такий формат даних, який подібний до структурі. воно (об'єднання) здатне зберігати в межах однієї зарезервованої області пам'яті різні типи даних. Але в кожний певний момент часу в об'єднанні зберігається тільки один з цих типів даних і можливо використовувати лише значення цього елемента (компонента). Синтаксично визначають об'єднання так (дуже схоже на визначення структури):
1 2 3 4 5 6 | union { short int name1; int name2; long int name3; } myUnion; // объект объединения |
Доступ до елементів об'єднання здійснюється так само, як і до елементів структур: Ім'я об'єкта об'єднання myUnion , точка . і ім'я елемента name1 .
До даних, які зберігають елементи структуры (например short, int, long) ми можемо звертатися до будь-який момент (хоч до одного, хоч і до всіх відразу). А в об'єднанні можуть зберігатися дані абоshort, либо int, либо long. Наприклад:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <iostream> using namespace std; union { short int name1; int name2; long int name3; } myUnion; int main() { myUnion.name1 = 22; cout << myUnion.name1 << endl; myUnion.name3 = 222222222; cout << myUnion.name3 << endl; cout << myUnion.name1 << endl; // снова обращаемся к name1 } |
запускаємо програму:
Як бачите, после того, як ми записали значення в елементname3 типудовго INT , вже неможливо нормально звертатися до елементу name1 . все тому, що в їх загальну пам'ять вже записано значеннядовго INT, а змінна типукороткий INT нездатна працювати з даними такого обсягу. Схематично можна це уявити так:
Тому, щоб знову працювати з даними типу короткий INT необхідно знову привласнити елементу name1 нове значення. Ось і виходить – пам'ять одна і та ж, а змінні в ній розміщуються різні. До якої звертаємося– така і запитує з цієї пам'яті значення.
Елементи об'єднання розташовуються в пам'яті починаючи з одного місця(як би накладаються один на одного), на відміну від елементів структури (вони розташовуються в пам'яті послідовно один за іншим).
Застосування об'єднань викликано необхідністю економії пам'яті, коли потрібно зберігати і використовувати дані різних типів, але звертатися до них можна не одночасно.
Якби ми описали просто набір змінних об'єднуючи їх в union, то для їх розміщення треба було б 2 + 4 + 4 байта = 10 байт. Ось і економія. А так об'єднання займає 4 байта. цілих 6 байт заощадили, натрамбовав три змінні в один відрізок пам'яті.
До слова потрібно зауважити, що ця технологія примудрилася отримати непогане продовження, і в сучасних мовах використовується всюди де потрібно і не потрібно. SiŞarp, PHP, Delphi, сучасні спадкоємці Сі плюс плюс – всі вони використовують такі об'єднання. Тільки в сучасному світі вони вже називаються варіант.
У змінну варіант можна без проблем запхати до 10 байт (10 це максимум для 32-х розрядних систем під дійсне число). Відповідно в ці 10 байт і все сімейство цілих і речових, і покажчики, і об'єкти, і рядки (точніше описатели рядків або покажчики на них) вміщуються.
На сьогоднішній день економія пам'яті не так актуальна, як 15-20 років назад. Конечно, ніхто не забороняє використовувати union, але навіщо? Якщо є більш зручні на сьогодні кошти роботи з пам'яттю для програміста.
Слід зазначити також, що програми для виконання в пам'ять завантажуються з надлишком (т.е. для програми виділяється кількість пам'яті, часто надзвичайно більшу ніж треба). Це можна спостерігати, написавши програму з однією змінною. Здавалося б – переменная 4 байта, але відкривши диспетчер задач в Винда програма “чомусь” зайняла 10 кілобайт. Так працює сучасна операційна система, виділяючи пам'яті з лишком. У 90-х, на жаль, такої розкоші і бути не могло.
У наступному уроці ми розглянемо бітові поля в С ++. Не полінуйтеся подивитися відео по темі Об'єднання (union) в С++:
Тобі реально бомбить?
Спочатку не зрозумів, потім прочитав нік цього індивіда, угарает 5 хвилин, спасибо!
Я так зрозумів, що якщо ми в об'єднання на 8 байт (де буде дабл, припустимо) shove int і шорти int (на обох потрібно 6 байт), то він буде так само перезаписувати з першого байта, т.е. один одному?)
Я за поясненням так зрозумів, але не зрозумів чому не ділиться пам'ять під кілька змінних, якщо така можливість є