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.
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.
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.
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-benKé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 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.
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