Ci sono così tanti diversi modelli di processore a cui risponderò solo in termini teorici e generali.
Considerare una matrice di oggetti a 16 byte che inizia con un indirizzo costituito da un multiplo di otto byte ma non da 16 byte. Supponiamo che il processore abbia un bus a otto byte, come indicato nella domanda, anche se alcuni processori no. Tuttavia, si noti che ad un certo punto dell'array, uno degli oggetti deve essere posizionato a cavallo di un limite di pagina: la mappatura della memoria di solito funziona in pagine da 4096 byte che iniziano sui confini di 4096 byte. Con una matrice allineata a otto byte, alcuni elementi dell'array inizieranno dal byte 4088 di una pagina e proseguiranno fino al byte 7 della pagina successiva.
Quando un programma tenta di caricare l'oggetto a 16 byte che attraversa il limite di una pagina, non può più eseguire una singola mappa di memoria da virtuale a fisica. Deve fare una ricerca per i primi otto byte e un'altra ricerca per i secondi otto byte. Se l'unità di carico/archivio non è progettata per questo, allora l'istruzione richiede una gestione speciale. Il processore potrebbe interrompere il suo tentativo iniziale di eseguire l'istruzione, dividerlo in due speciali microistruzioni e rimandarle nella coda di istruzioni per l'esecuzione. Questo può ritardare l'istruzione di molti cicli del processore.
Inoltre, come osservato da Hans Passant, l'allineamento interagisce con la cache. Ogni processore ha una memoria cache ed è comune che la cache sia organizzata in "linee" a 32 o 64 byte. Se si carica un oggetto a 16 byte allineato a 16 byte e l'oggetto si trova nella cache, la cache può fornire una riga della cache che contiene i dati necessari. Se si stanno caricando oggetti a 16 byte da una matrice non allineata a 16 byte, alcuni oggetti dell'array si troveranno a cavallo di due linee di cache. Quando questi oggetti vengono caricati, è necessario recuperare due righe dalla cache. Questo potrebbe richiedere più tempo. Anche se non ci vuole più tempo per ottenere due righe, forse perché il processore è progettato per fornire due linee cache per ciclo, questo può interferire con altre cose che sta facendo un programma. Comunemente, un programma caricherà dati da più posti. Se i carichi sono efficienti, il processore potrebbe essere in grado di eseguire due in una volta. Ma se uno di questi richiede due linee di cache anziché quella normale, blocca l'esecuzione simultanea di altre operazioni di caricamento.
Inoltre, alcune istruzioni richiedono esplicitamente indirizzi allineati. Il processore potrebbe inviare queste istruzioni in modo più diretto, ignorando alcuni dei test che risolvono le operazioni senza indirizzi allineati. Quando gli indirizzi di queste istruzioni vengono risolti e si riscontrano disallineamenti, il processore deve interromperli, poiché le operazioni di correzione sono state ignorate.
fonte
2013-05-23 01:08:44
"Come sappiamo, la CPU X86 ha un bus dati a 64 bit" - non è vero. x86 non dice nulla sulle dimensioni del bus dati. I processori moderni hanno larghezze di bus dati più grandi di così. – Mysticial
Il processore non legge i dati dal bus dati, li legge dalla cache. È necessario un allineamento di 16 byte per evitare di scavalcare un limite della linea cache. –
@Mysticial Penso che le più popolari CPU x86 abbiano attualmente un bus dati a 64 bit, no? – iqapple