2012-08-02 12 views
12

Come noto, per impostazione predefinita verrà eseguito l'allineamento a 4 byte. diconoperché il padding non sta accadendo in questo caso?

typedef struct 
{ 
    int data7; 
    unsigned char data8; 
    //3 -bytes will be added here. 
}Sample1; 

così sizeof(Sample1) sarà 8.

Ma per la seguente struttura, perché imbottitura non è accaduto ?.

typedef struct 
{ 
    unsigned char data1; 
    unsigned char data2; 
    unsigned char data3; 
    unsigned char data4; 
    unsigned char data5; 
    unsigned char data6; 

}Sample2; 

Ma il sizeof (Sample2) dista solo 6. Questo Sample2 non è una struttura allineata a 4 byte?

EDIT ::

Secondo Wiki

allineamento dati significa mettere i dati a un offset uguale a un multiplo della dimensione della parola, che aumenta le prestazioni del sistema di memoria a causa del modo la CPU gestisce la memoria.

Ma i membri di Sample2 non saranno allineati in multipli di due a destra ??

Grazie.

+2

buona domanda +1 – Angus

risposta

20

Nessuno dei campi nella seconda struttura richiede un allineamento di 4 byte. unsigned char richiede solo l'allineamento a 1 byte. Pertanto, non è necessario allineare effettivamente a 4 byte.

Le strutture sono generalmente allineate solo al massimo allineamento di tutti i campi.

+9

Per la modifica: Quella "dimensione della parola" non è necessariamente uguale alla dimensione della parola nativa del processore. Se i tipi di dati sono più piccoli, è possibile applicare una dimensione di parola più piccola. Ad esempio, su x86, non c'è penalità di prestazioni per accedere a un 'char' a un indirizzo' mod 4! = 0'. Ma ci sarà se provate ad accedere a un 'int' di 4 byte con' mod 4! = 0' perché attraversa un limite di allineamento di 4 byte. – Mysticial

+1

Grazie a @Mystical. Risposta molto necessaria. Questo è quello che sto cercando. – Jeyaram

5

data7 è un elemento a 4 byte, quindi il compilatore normalmente tentare di allinearlo a un indirizzo che è un multiplo di 4.

data1 è un elemento di un byte, quindi il compilatore non cercherà di allinearlo a qualsiasi limite particolare (cioè, non ci sarebbe alcun guadagno reale dal farlo).

3

No, in un'implementazione tipica Sample2 non è una struttura allineata a 4 bute. È una struttura allineata a 1 byte.

In un'implementazione tipica, il requisito di allineamento dell'intera struttura viene calcolato come massimo del requisito di allineamento dei singoli membri. Questo è il motivo per cui il tuo Sample1 ha requisito allineamento dei int (4 sulla vostra piattaforma), e la vostra Sample2 ha requisito allineamento del unsigned char, che è 1.

1

Char richiede 1 allineamento di byte. Il tipo di dati massimo è char, , che è un allineamento di un byte, quindi si ottiene la dimensione come "6".

È possibile controllare questo sito per maggiore comprensione. http://www.geeksforgeeks.org/archives/9705. Hanno spiegato in dettaglio.

Problemi correlati