|
|
Użytkownik "dziobu" <xxxxxxxx@xxxxxxx> napisał w wiadomości
news:g6q8i7$cod$1@xxxxxxxxxxxxxxx
Dla wielu elementów:
TTest = record
a : Byte;
b : Integer;
end;
sizeof(TTest) = 8
Moim zdaniem zasada jest taka że pole długości 1 nie jest wyrównywane, pole
długości 2 zaczyna się od wielokrotności 2, pole wielkości 4 od
wielokrotności 4, pole długości 8 od wielokrotności 8 (jeżeli ustawimy w
opcjach wyrównywnaie do 8, bo możemy ustawić wyrównywanie do 4 i 2)
Tak więc jeżeli będą po sobie występować dwa pole 1-bajtowe, to dla każdego
nie będziemy rezerwować 4-bajtów, a jeżeli po bajcie wystąpi integer, jak w
powyższym przykładzie to miezy polami będą 3 bajty przerwy
Poza tym rekord
TTest = record
b : Integer;
a : Byte;
end;
ma rozmiar 8 bajtów bo cały record ma dodawane pola aby był wielokrotnością
4 czy 8 bajów, bo możemy mieć tablicę takich recordów i chcemy aby pola
drugiego recordu w tablicy były wyrównane
Uwaga: nawet gdy mamy ustawione w opcjach wyrównywanie do 8, a w recordzie
nie będzie pola odpowiedniej długości który by uzasadniał takie
wyrównywanie. będzie wyrówany tylko tyle ile trzeba
TTest = record
a,b,c:byte;
end
długośc 3 - bo pola same bajty nie wymagające wyrównania
TTest = record
a,b,c:integer
end;
12 bajtów - nic nie dodane na końcu
TTest = record
a,b:integer;
c:byte;
end;
12 bajtów, wyrównanie do 4 bo największe pole ma 4 bajty
TTest = record
a: int64;
b:integer;
end;
16 bajtów - wyrówanie do 8 (jak ustawiono w opcjach) kest wyrówanie do 8 bo
istnieje pole długości 8 które musi zaczynać się od wielokrotności 8
A gdy w opcjach ustawiłem wyrównanie do 4, czyli maskymalnie do 4 rozmiar
powyższego to 12 - bo opcja
Project | Options | zakładka Compiler | grupa Code genaration | Record field
alignment
określa maksymalne wyrównanie, które będzie zastosowane gdy mamy pola
odpowiedniej długości.
A co z polami długości np. 3 i 6 ? nie ma takich typów, najwyżej może być
tablica i wtedy wyrówwujemy do elemntu tablicy a nie tablicy jako całości:
TTest = record
a:byte;
tab:array[0..7] of byte;
end;
Ma 9 - nic nie dodane
Jednak gdy chcemy mieć reprezentacje recodru dokładnie taką jak definiujemy,
gdy np. czytamy record z pliku - wtedy piszemy "packed record"
|
|