2014-09-22 4 views
0

Я пытаюсь понять структуру прокладки. Ниже структуры дополняется:sizeof struct менее 4 B сообщается актуально

struct s { 
int j; 
char c; 
int i; 
}; 

==> SizeOf (структура s) = 12

Но для этой структуры это не дополнение. Зачем?

struct s { 
char c; 
} 

==> SizeOf (структура с) = 1 ИЛИ

struct s { 
short int i; 
} 

==> SizeOf (структура с) = 2

Почему обивка не применяется для вышеупомянутых двух Структуры?

+4

Padding традиционно делается для того, чтобы поместить участников в смещения, которые хороши с точки зрения процессора. Если у вас только один член, смещение всегда будет равным нулю, нет необходимости в заполнении. –

+0

Вы можете проверить [этот ответ] (http://stackoverflow.com/questions/12861582/why-is-padding-added-for-multiple-data-members-of-structures-and-not-for-single) –

ответ

0

Набивка добавляется, чтобы убедиться, что элемент int выровнен.

Предполагая, что ваш int имеет размер 4 байта, он будет размещен на границе 4 байта, чтобы выровнять его. Это означает, что после char есть 3 байта заполнения. Поэтому размер 12 вполне разумен.

Представьте, если не было прокладки. Тогда Смещения будет:

 
Member Offset 
j  0 
c  4 
i  5 

Если структура была выложена таким образом, то i бы неправильно выровнены. Для того, чтобы разместить его на границе 4 байт, она должна быть компенсировано 8. Отсюда 3 байта заполнения, а также общий размер 12. Таким образом, фактическая раскладка:

 
Member Offset 
j   0 
c   4 
<padding> 5 
i   8 
1

Перетяжка сделано, чтобы сохранить члены struct выравниваются, так что доступ быстро (*) Рассмотрим, что происходит в массиве структур:.

struct s { 
    int i; 
    char c; 
}; 

struct s a[0]; 

Если структура не раздувались, a[1] бы адрес (char *)a + 5. Это не согласовано, если a[0] выровнен. Следовательно, структура обычно будет дополнена кратным sizeof(int). (Были i в long long, то вся структура будет дополнена кратному sizeof(long long);. Попробовать и посмотреть)

С одной char, нет необходимости прокладки, потому что char будет выровнен в любом случае, в то время как есть нет другие члены, которые становятся негласными. При одном short выравнивание 2 достаточно, чтобы всегда поддерживать единый элемент.

(*) На некоторых процессорах, но не на совместимых с Intel x86 системах, неравномерный доступ может фактически привести к краху вашей программы.