Обединения (union)

   Определение:    oбединенията дават възможност една и съща част от паметта да бъде използвана от различни типове данни, но всяка промяна на стойността в дадена променлива (елемент) от обединението, довежда до промяна в стойностите в другите променливи (елементи) от обединението. Защото използват един и същ фрагмент памет.

      Деклариране:

union Етикет                                            union Name
{                                                            {
тип1 член1;                                                      char c;
тип2 член2;                                                      int x;
тип3 член3;                                                      double y;
.                                                            } a;
.
типN членN;
} име на обекта (променливата);

union

        В примера от по-горе обекта на обединението е: а и съответно char а.с заема място 1 byte,, елемента int a.x, заема 4 bytes,, елемента от обединението double а.y , заема 8 bytes, от общия размер памет. А самото обединение заема толкова памет, колкото заема най-големия елемент на обединението.

      Действие :
      union – служебната дума за деклариране на обединение;
      Етикет – името на обединението-незадължителна част, но обекта (променливата)
трябва де е деклариран, тук след затварящата фигурна скоба
      тип – показва от какъв тип ще бъдат променливите (идентификаторите);
      име на обекта - не задължително поле, служи за директно деклариране на обекти.


   Пример 1: Създаваме четри променливи от различен тип. След това извеждаме, каква част от паметта заемат.

#include <iostream> //for Code Blocks
using namespace std;
union myunion {
char c;
int x;
double y;
int arr[10];
} a;
int main()
{
cout<< "size a.c= "<< sizeof(a.c)<< endl;
cout<< "size a.x= "<< sizeof(a.x)<< endl;
cout<< "size a.y="<< sizeof(a.y)<< endl;
cout<< "size arr[0]="<< sizeof(a.arr[0])<< endl;
cout<< "size arr[10]x4= "<< sizeof(a.arr)<< endl;
return 0;
}


Обяснение:
резултатът от изпълнението е:
size a.c= 1
size a.x= 4
size a.y=8
size arr[0]=4
size arr[10]x4= 40
size a ==> 40
Размерът на тип char e 1 байт.
Размерът на тип int е 4 байта.
Размерът на тип double e 8 байта.
size arr[0]=4 извежда размера само на един елемент от масива
Обърнете внимание, по какъв начин се извежда размера на масива.
cout<< "size arr[10]x4= "<< sizeof(a.arr)<< endl;
Максималният размер на обединението се извежда, чрез:
size a ==> 40



   Пример 2: Същият пример от по-горе, но максималния размер на обединението е 8 байта.

#include <iostream> //for Code Blocks
using namespace std;
union myunion {
char c;
int x;
double y;
// int arr[10];
} a;
int main()
{
cout<< "size a.c= "<< sizeof(a.c)<< endl;
cout<< "size a.x= "<< sizeof(a.x)<< endl;
cout<< "size a.y="<< sizeof(a.y)<< endl;
// cout<< "size arr[10]x4= "<< sizeof(a.arr)<< endl;
cout<< "size a ==> "<< sizeof(a)<< endl;
return 0;
}

Резултатът от изпълнението е:
size a.c= 1
size a.x= 4
size a.y=8
size a ==> 8

Променливата а извежда максималният размер на обединението.


Благодаря за вниманието Ви !