2013-05-25 9 views
7

Witam wszystkich,
Chcę wiedzieć, czy unia używa wypełnienia?
ponieważ rozmiar związku jest największym rozmiarem elementu danych, czy może być dopełnienie na końcu?Wypełnienie w zespole jest obecne lub nie

+1

Krótko mówiąc, ** Tak **! W moim systemie Windows, złącze jest dopełniane, aby mieć rozmiar, który jest wielokrotnością wielkości 'int', tj. ** 4 bajty **. Więc jeśli nie użyj '#pragma pack (1)', związek mający rozmiar 3 bajtów zostanie dopełniony o jeden bajt, aby uzyskać 4 bajty. Utwórz program i wypróbuj go przed opublikowaniem pytania. –

+0

"unia jest dopełniana, aby mieć rozmiar będący wielokrotnością rozmiaru int, czyli 4 bajty." ale w tym przypadku związku ab { char a; } a; rozmiar jest 1 – akash

+1

W twoim przypadku nie ma w ogóle padding.Who powiedzenia "padding" jest zawsze zrobione? Tak jak Daniel Fischer powiedział, nie jest ** mandated ** przez standard. –

Odpowiedz

-3

Unia kiedy używamy z prymitywnych typów wewnątrz to

union 
{ 
    char c; 
    int x; 
} 

Wydaje się, że nie używa wyściółkę ponieważ największy rozmiar danych jest w każdym razie jest wyrównany do brzegowych.

Ale kiedy zagnieżdżamy strukturę w ramach związku, robi to.

union u 
    { 
     struct ss 
     { 
      char s; 
      int v; 
     }xx; 
    }xu; 

Wynikało to w rozmiarze 8.

więc odpowiedzieć na Twoje pytanie jest wypełnienie jest persent w jedności.

+1

W takim przypadku masz już dopełnienie w strukturze 'struct'. –

+0

Jak Daniel zasugerował, że to jest złe. Odwołujesz się do dopełniania struct jako dopełnienia unii, co jest mylące. – kadina

14

od wielkości unii to największy rozmiar członek dane

które nie muszą być prawdziwe. Rozważmy:

union Pad { 
    char arr[sizeof (double) + 1]; 
    double d; 
}; 

Największy członek tego związku to arr. Zwykle jednak double zostanie wyrównane na wielokrotności czterech lub ośmiu bajtów (w zależności od architektury i rozmiaru double). W niektórych architekturach jest to nawet konieczne, ponieważ w ogóle nie obsługują one niepodpisanych odczytów.

Tak sizeof (union Pad) jest zazwyczaj większy niż sizeof (double) + 1 [typowo 16 = 2 * sizeof (double) w systemie 64-bitowym i 16 lub 12 w systemie 32-bitowej (w systemie 32-bitowego, przy czym 8-bitowa char i 64-bitowe double wymagany wyrównanie dla double może nadal być tylko czterema bajtami)].

Oznacza to, że w tym miejscu musi być wyściółka, która może być umieszczona tylko na końcu.

Ogólnie rzecz biorąc rozmiar union będzie najmniejszą wielokrotnością największego wyrównania wymaganego przez dowolny element, który nie jest mniejszy niż największy element.

+0

, ale gdy mamy w zbiorniku char arr [sizeof (double) +1], to po prostu daje rozmiar: 9? – Dineshkumar

+0

To nie jest wymagane przez standard, implementacja może dodać dopełnienie, ale ogólnie (z 8-bajtowymi "podwójnymi"), tak, to dałoby rozmiar 9. –

+0

Czy ktoś zdołał udowodnić, że ten przykład będzie pad w górę? - pytając, ponieważ nie wydaje mi się, aby istniał powód, by się tu podkładać, ale nie tak, jak gdyby potrzebował przestrzeni między dwoma członkami, powinien wybrać największy. – ideasman42