Csomagolás összetett adattípusok Delphi

Ebben a cikkben szeretném elmondani és megmutatni a funkciók használatát
„Seal összetett adattípusok” Delphi.

Minden valaha meg kellett küzdenie a rekordokat. Felvételnél használt sok esetben,
- a fájl létrehozásához könyvtárakat, könnyen csoportosítása és bemutatása
adatokat, a rendszer programozás, stb Például, egy fájl megnyitásakor Windows.pas
(Standard modul a felhasználások szakasz), akkor talál valami ilyesmit
ez a leírás:

_POINTL = csomagolt rekord
x: Longint;
y: Longint;
végén;

TISHMisc = csomagolt rekord
esetében értéke // Ezt alkalmazzák belépési lehetőséget
0: (PhysicalAddress: DWORD);
1: (VirtualSize: DWORD);
végén;

Mi itt jelöli a kulcsszó csomagolva? Csomagolt szó szerint Delphi
minimalizálása memóriát. Így kiderül, anélkül, hogy ez a szó a mi struktúra
Tart több memóriát?

Itt egy példa a bejegyzést:

TRecord = Record
pole1. byte;
pole2. string [4];
pole3. integer;
pole4. int64;
végén;

Nézzük méretének kiszámítása: pole1 - 1 byte, pole2 - 5 bájt (remélhetőleg nem
elfelejtette 4 bájt, és egy kód mérete alatt 1), pole3 - 4 bájt, pole4 - 8 bájt.
Ha hozzá őket, hogy 18 byte. Nézzük:

méret1: = sizeof (TRecord);
ShowMessage ( 'normál felvétel méretű =' + IntToStr (méret1));

Meglepett? Most adjuk hozzá a szó előtt csomagolt szót ... Felvétel mérete 18, mint
Becslések korábban. Szóval hol vagyunk hiányzik a teljes 6 bájt. És ha van
egy sor 10 millió ilyen nyilvántartások, például néhány könyvtár, mi
Elveszítjük körülbelül 57 megabájt?

Lássuk, miért van ez így. Ehhez felhasználtam a beépített
disassembler Delphi. Az alak a dobás gombra, majd a felvezető írás:

eljárás TForm1.Button1Click (Sender: TObject);
típus
// normál felvételi
TRecord = Record
pole1. byte;
pole2. string [4];
pole3. integer;
pole4. int64;
végén;
// csomagolt rekord
TPackedRecord = csomagolt rekord
pole1. byte;
pole2. string [4];
pole3. integer;
pole4. int64;
végén;

Ne feledje, hogy pole1 mi értéket rendelni a $ FF (azaz = 255), pole2 = 'hack', pole3
= $ Aaaaaaaa (4 bájt, azaz = 2863311530), stb Nézd meg a képet, rajta vagyok
Azt mutatja a bájtstruktúra és hogyan helyezkednek el a memóriában.

Most ellenőrizze a becsomagolt rekordot. Rec változót a kód helyére
packedRec, azaz Mi használjuk a csomagolt rekordot. És mi mind ugyanaz:

Itt azt látjuk, hogy nincs byte egyeztetés nem, és az összes adatot (mező)
Ezek elrendezve egymás mögött - tele.

Lehet, hogy a kérdés: miért az adatokat az első példában, egy vonalban van a
8-os határon? Minden az ügyet a fordító beállításait. Ha megnyitja a Project -
Opció - fordító (compiler lehetőség), akkor nem lesz kis lista rekordmező
összehangolás, amelyben kiválaszthatja a kívánt beállítást (8,4,2 vagy 1 byte). nem
Elfelejtjük, hogy rendezni a projekt a változás után. Mellesleg a összehangolása 1 bájt
és van egy adatcsomag.

A második kérdés, hogy miért nem mindig tele adatokat? Sajnos, a csomagolás
Információ nem csak előnyei, de hátrányai is vannak. Így például, hogy hangolják össze a határ
növeljük a hozzáférési idő a mezőket. Ezért szükséges, hogy egy csomag bölcsen.

By the way, az azonos Windows.pas fájl található a nem csak a csomagolás feljegyzések, de
és tömbök, itt egy példa:

CprMask: csomagolt array [0..3] DWORD;

Próbáld ki magad, hogy elemezze a csomagoláson a tömbben.

Itt található az ezt a cikket egy ismerősének: