Adatigazítás

Néhány hardverplatform esetében szigorú követelmények vannak az adatok igazításához. Egyes rendszereken, általában RISC-nél, a helytelenül igazított adatok betöltése egy csapda generálásához, egy hiba, amely kezelhető. Más, természetellenesen összehangolt adatokkal rendelkező rendszereken dolgozhat, de ez a termelés csökkenéséhez vezet.

voditelnosti. Hordozható kód írásakor meg kell akadályoznia az igazításhoz kapcsolódó problémákat, és minden típusú adatnak természetes beigazítással kell rendelkeznie.

Hogyan lehet elkerülni az igazítási problémákat?

A fordító rendszerint megakadályozza az igazításhoz kapcsolódó problémákat, az összes adattípus természetes összehangolásával. Valójában a rendszermag-fejlesztőknek általában nem kell foglalkozniuk az összehangolással kapcsolatos problémákkal, ezt a gcc fordító fejlesztőinek kell gondoskodnia. Azonban ezek a problémák még akkor is előfordulhatnak, amikor a fejlesztőnek mutatókkal és hozzáférési adatokkal kell végrehajtania a műveleteket, figyelmen kívül hagyva, hogy a fordító hogyan végzi el az adat-hozzáférési műveleteket.

char * p = kutya [1];

jel nélküli hosszú 1 = * (alá nem írt hosszú *) p;

Ha úgy gondolja: „Miért van szükség”, akkor valószínűleg igaza van, de ha így is tett, valamit csinálni, és valaki másnak, ezért óvatosnak kell lenni példát .. amelyek megtalálhatók a való életben, nem feltétlenül olyan nyilvánvalóak.

Nem szabványos adattípusok összehangolása

• A tömb összehangolása ugyanúgy történik, mint az első elem adattípusának összehangolása (minden más elem automatikusan igazodik automatikusan).

• A szakszervezet összehangolása megegyezik a legnagyobb, méretű és típusú adatok összehangolásával azokkal, amelyek az unióban szerepelnek.

• A struktúra igazítása megfelel a legnagyobb méretnek, a méretnek és az adatok típusának a szerkezet minden területének típusai közötti összehangolásához.

A struktúrákban a padding különböző módjai is használhatók.

A szerkezetek úgy vannak kitöltve, hogy minden elemének természetes összehangolása legyen. Például, vegye figyelembe a következő adatszerkezetet egy 32 bites gépen.

char kutya; / * 1 byte * / unsigned longcat; / * 4 byte * / alá nem írt shortpig; / * 2 bájt * /

charfox; / * 1 bájt * /

Ez a memóriában lévő adatszerkezet nem úgy tűnik, hogy a természetes összehangoláshoz vezet. A memóriában a fordító olyan adatstruktúrát hoz létre, amely úgy néz ki, mint a következő.

char kutya; / * 1 bájt * / u8 __pad0 [3]; / * 3 bájt * / alá nem írt hosszú macska; / * 4 bájt * / aláírás nélküli rövid sertés; / * 2 bájt * /

char fox; / * 1 bájt * /

u8 padl; / * 1 bájt * /

A kitöltési változókat be kell vezetni annak érdekében, hogy a struktúra összes elemének természetes összehangolása biztosított legyen. Az első töltési változó további memória költségeket vezet be, hogy a mezőt a határon helyezze el

Felhívjuk a figyelmet arra, hogy a sizeo f (foo_struct) kifejezés a legtöbb 32 bites hardverplatformon a struktúra bármely példányán 12-es. A C-fordító automatikusan kitöltési elemeket ad hozzá a szükséges illesztés biztosításához.

Gyakran lehetséges a szerkezeti mezők átrendezése, hogy elkerülje a töltés szükségességét. Ez lehetővé teszi, hogy helyesen illeszkedjenek az adatok, anélkül, hogy további töltőelemeket vezetnének be, és ennek megfelelően egy kisebb szerkezetet.

állattenyésztő állatok

alá nem írt hosszú macska; / * 4 bájt * / aláírás nélküli rövid sertés; / * 2 bájt * / char kutya; / * 1 bájt * /

char fox; / * 1 bájt * /

Ez az adatszerkezet 8 bájt méretű. Azonban nem mindig lehetséges a szerkezeti elemek helyeken történő átrendezése és a struktúra definíciójának megváltoztatása.

túrák. Például ha egy struktúra egy szabvány részeként kerül kiadásra, vagy már létező kódban van használatban, akkor a mezők sorrendje nem módosítható. Néha valamilyen oknál fogva szükség lehet egy speciális struktúrák sorrendjére, például a speciális változó igazításra a gyorsítótár találatainak optimalizálása érdekében. Vegye figyelembe, hogy az ANSI C szabvány szerint a fordítónak soha nem szabad megváltoztatnia a mezők sorrendjét az adatstruktúrákban5 - ez a jog csak a programozó tulajdonában van.

A rendszermag fejlesztőknek figyelembe kell venniük az adatszerkezetek cseréjének sajátosságait: a struktúrák átvitele a hálózaton keresztül vagy közvetlen mentés a lemezre, mivel a szükséges töltés különböző lehet a különböző hardverplatformokon. Ez az egyik oka annak, hogy a C programozó nyelvnek nincs szerkezeti összehasonlító operátora. Az adatszerkezetek feltöltésére használt memória véletlenszerű adatokat tartalmazhat, ami lehetetlenné teszi a struktúrák byte-hez való viszonyítását. A C programozó nyelvének fejlesztői helyesen tették, hogy elhagyták azt a problémát, hogy a struktúrákat a programozó saját belátása szerint hasonlítják össze, akik saját konkrét esetben létrehozhatják saját összehasonlítási funkcióikat, hogy sajátos struktúrákat építsenek fel.

Kapcsolódó cikkek