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
Odpowiedz
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.
W takim przypadku masz już dopełnienie w strukturze 'struct'. –
Jak Daniel zasugerował, że to jest złe. Odwołujesz się do dopełniania struct jako dopełnienia unii, co jest mylące. – kadina
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.
, ale gdy mamy w zbiorniku char arr [sizeof (double) +1], to po prostu daje rozmiar: 9? – Dineshkumar
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. –
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
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. –
"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
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. –