pl.comp.lang.delphi
[Top] [All Lists]

Re: Wielkość rekordu

Subject: Re: Wielkość rekordu
From: "Borneq"
Date: Wed, 30 Jul 2008 21:09:12 +0200
Newsgroups: pl.comp.lang.delphi


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"

<Prev in Thread] Current Thread [Next in Thread>
Privacy Policy