2012-06-19 13 views
5

Il tipo di ciascun membro della struttura di solito ha un allineamento predefinito. Il membro della struttura i.e.each è allineato su un limite predeterminato. Per questo motivo l'imbottitura è eseguita nel seguente esempio wiki:Perché favorire l'allineamento della struttura dei dati?

struct MixedData 
{ 
    char Data1; 
    short Data2; 
    int Data3; 
    char Data4; 
}; 



struct MixedData /* After compilation in 32-bit x86 machine */ 
{ 
    char Data1; /* 1 byte */ 
    /* 1 byte for the following 'short' to be aligned on a 2 byte boundary 
assuming that the address where structure begins is an even number */ 
    char Padding1[1]; 
    short Data2; /* 2 bytes */ 
    int Data3; /* 4 bytes - largest structure member */ 
    char Data4; /* 1 byte */ 
    char Padding2[3]; /* 3 bytes to make total size of the structure 12 bytes */ 
}; 

Qual è la (pratico) ragione che l'allineamento deve essere conservato?

+0

possibile duplicato di [Perché C++ non rende la struttura più stretta?] (Http://stackoverflow.com/questions/6730664/why-doesnt-c-make-the-structure-tighter) –

+2

Fare riferimento a questo link. Ti aiuterà a comprendere in che modo l'allineamento rende possibile un accesso veloce. http://www.geeksforgeeks.org/archives/9705 –

risposta

8

Le letture e le scritture non allineate di solito richiedono che la CPU recuperi le due parole adiacenti dalla memoria (anziché solo una) e applichi un'ulteriore aritmetica bit a bit per eseguire correttamente l'operazione designata.

Alcune architetture, come x86, lo consentono a un costo di prestazioni. Altre architetture (in particolare ARM) generano un'eccezione (di solito con un segnale SIGBUS per un processo utente) o addirittura "arrotondano" l'indirizzo al limite più vicino che potrebbe causare alcuni bug molto sgradevoli.

+2

Inoltre, e importante per la programmazione simultanea, l'accesso non allineato non può essere reso atomico, mentre è allineato un barattolo. –

9

Su molte architetture, le letture e le scritture allineate da e verso la memoria principale sono molto più veloci delle loro controparti non allineate.

+9

E su alcuni, l'accesso non allineato è vietato. – osgx

+4

su alcune architetture provocheranno anche un'eccezione se il compilatore non genera codice per aggirare le letture/scritture non allineate – mensi

+2

Nella maggior parte delle architetture un accesso su due pagine determinerà un'eccezione MMU e la gestione di un caso simile è un servizio del sistema operativo . Un compilatore senza allineamento garantisce quindi che non potrebbe produrre un kernel senza un grande sforzo da parte del programmatore. – Potatoswatter

2

Di solito, la struttura è allineata su un allineamento dipendente dal processore per rendere l'accesso il più veloce possibile utilizzando la dimensione del registro "naturale" del processore.

Per processori a 32 bit, è 4 byte (o 32 bit), per processori a 64 bit è 8 byte.

Alcuni processori (non x86) generano un errore se si tenta di accedere (ad esempio) a un int se non è allineato sul limite corretto.

La comunicazione tra diversi dispositivi è un motivo pratico per preservare l'allineamento. Con l'allineamento di default, questa struttura sarebbe lunga 24 byte, mentre su un processore a 64 bit, sarebbe 48 byte, e non degli elementi tranne il primo sarebbe nella stessa posizione.

In genere è possibile modificare il riempimento della struttura con una direttiva del compilatore/pragma che può annullare la necessità del riempimento manuale specificato nell'esempio, ma in genere è diverso per ogni compilatore.

Problemi correlati