allineamento delle variabili in memoria (a breve storia).
In passato i computer avevano un databus a 8 bit. Ciò significa che ogni ciclo di clock può elaborare 8 bit di informazioni. Che andava bene allora.
Poi sono arrivati computer a 16 bit. A causa della compatibilità verso il basso e di altri problemi, il byte a 8 bit è stato mantenuto e la parola a 16 bit è stata introdotta. Ogni parola era di 2 byte. E ogni ciclo di clock 16 bit di informazioni potrebbero essere elaborati. Ma questo ha posto un piccolo problema. sguardo
Let ad una mappa di memoria:
+----+
|0000|
|0001|
+----+
|0002|
|0003|
+----+
|0004|
|0005|
+----+
| .. |
Ad ogni indirizzo v'è un byte cui si può accedere individualmente. Ma le parole possono essere recuperate solo agli indirizzi pari. Quindi se leggiamo una parola a 0000, leggiamo i byte a 0000 e 0001. Ma se vogliamo leggere la parola alla posizione 0001, abbiamo bisogno di due accessi di lettura. Prima 0000,0001 e poi 0002,0003 e manteniamo solo 0001,0002.
Naturalmente questo ha richiesto un po 'di tempo extra e questo non è stato apprezzato. Ecco perché hanno inventato l'allineamento. Quindi memorizziamo le variabili di parola ai confini delle parole e alle variabili di byte ai limiti dei byte.
Per esempio, se abbiamo una struttura con un campo di byte (B) e un campo di parola (W) (e un compilatore molto ingenuo), otteniamo la seguente:
+----+
|0000| B
|0001| W
+----+
|0002| W
|0003|
+----+
Che non è divertente . Ma quando si usa l'allineamento delle parole troviamo:
+----+
|0000| B
|0001| -
+----+
|0002| W
|0003| W
+----+
Qui la memoria viene sacrificata per la velocità di accesso.
Si può immaginare che quando si utilizza la doppia parola (4 byte) o la parola quadrupla (8 byte) questo è ancora più importante. Ecco perché con la maggior parte dei compilatori moderni è possibile scegliere quale allineamento si sta utilizzando durante la compilazione del programma.
Poiché gli altri hanno spiegato che cos'è l'allineamento dello stack e perché viene utilizzato, voglio solo aggiungere i miei due centesimi relativi a _ "Può essere controllato dalle impostazioni del compilatore?" _. Vedi [questa domanda] (http://stackoverflow.com/questions/5496045/why-is-my-stack-pointer-only-incrementing-in-multiples-of-16?lq=1) – andreee