Igazítás a memóriában

A számítás során a memória igazítási korlátai a memória címek bizonyos többszörösére korlátozódnak , ahol bizonyos adatok és gépi utasítások tárolhatók. Ezenkívül a memória igazításának optimalizálása lehetővé teszi, hogy a program végrehajtási sebességét csak a megfelelő címek kiválasztásával befolyásolja.

Elv

Ahhoz, hogy növeljék a teljesítményt, processzorok gyakran csatlakozik RAM egy adatbusz, amely nagyobb, mint a tagoltságát azok címzés: például egy processzor képes egyedi címzése byte (8 bit ), csatlakozik a memória egy 4 bájtos ( 32 bites) busz. Ha egy 4 bájtos adat nem egy címmel osztható 4-gyel, akkor a processzor modelljétől függően:

Az adatok megfelelő összehangolására általánosan alkalmazandó szabály az, hogy a méretével osztható címen találhatók. Így az egyetlen bájtot elfoglaló adatelem mindig jól igazodik, két bájt adatai jól igazodnak, ha páros címen vannak, a 4 bájtos adatok jól igazodnak, ha 4-vel osztható címen vannak stb. Az igazítási kényszer azonban nem haladja meg az alapul szolgáló hardvert.

A memóriában lévő igazítási korlátok a processzor architektúrájától függenek . Az igazítás optimalizálása finomabb, mivel függhet a processzor gyorsítótárának memóriájától, a virtuális memória lapozásától és a memória egyéb hozzáférési jellemzőitől. Egyes fordítók lehetővé teszik az adatok igazításának befolyásolását.

Kényelmes

Utasítás

A RISC processzorok általában csak egy gépi utasításmérettel rendelkeznek, és ezeket az utasításokat megfelelően kell összehangolni. Ezzel szemben a CISC processzorok különböző méretű utasításokkal rendelkeznek. Tehát néha jó lehet, ha a teljesítmény hatástalan (gyakran nevezett nop) műveletet illeszt be , hogy a későbbi állítások jobban illeszkedjenek egymáshoz.

Adat

Ha a memóriában egymás után különböző méretű adatokat tárolnak, hasznos, sőt szükséges lehet hézagokat hagyni közöttük, hogy mindegyikük megfelelően illeszkedjen. Ez különösen a végrehajtási veremben és az összeállított adattípusokban figyelhető meg .

Adattípusú vegyület C-ben

Kétféle, C nyelven összeállított adattípust vegyen figyelembe egy 64 bites (8 bájtos) címzett busszal rendelkező berendezés figyelembevételével:

struct no_align { char c; double d; int i; char c2[3]; }; struct align { double d; int i; char c2[3]; char c; };

Mindkét struktúra ugyanazokat a tagokat tartalmazza. Ezért arra következtethetnénk, hogy azonos méretűek. Így feltételezve, hogy:

  • a típus char1 bájt;
  • a típus int4 bájt;
  • a típus double8 bájt.

a teljes méret 1 + 8 + 4 + 3 × 1 = 16 bájt lenne.

Ha azonban a méretet az utasítással printf("%zu %zu\n", sizeof(struct no_align), sizeof(struct align));jelenítjük meg, jó eséllyel 24 és 16 bájtot kapunk. Valójában a struktúra aligntagjai jól illeszkednek egymáshoz, de nem no_align. A fordító úgynevezett kitöltési bájtokat ad hozzá az igazítás tiszteletben tartásához. Összeállításakor így no_alignnéz ki:

struct no_align_compile { char c; char __pad1[7]; double d; int i; char c2[3]; char __pad2; };

Ne feledje, hogy __pad1lehetővé teszi da 8-as többszörösének megkezdését, és __pad2befejezi a struktúrát, hogy elérje a 24-et, a 8-szorosát.

Összeállítási lehetőségek

A GCC esetében az opcióval -Wpaddedmegtudhatja, hogy egy struktúrához szükség van-e párnázásra . Íme a fordításkor kapott üzenetek struct no_align :

Warning padding struct to align 'd' Warning padding struct size to alignment boundary

Bibliográfia