Почему заполнение в этом случае не происходит?

Как мне известно, по умолчанию будет выполнено 4-байтовое выравнивание. говорят

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

поэтому sizeof(Sample1) будет 8.

Но для следующей структуры, почему заполнение не произошло?.

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

}Sample2;

Но sizeof (Sample2) равен 6. Этот Sample2 не является 4-байтовой выровненной структурой?

ИЗМЕНИТЬ::

Согласно Wiki

Согласование данных означает перенос данных со смещением памяти, равным нескольким кратным размеру слова, что увеличивает производительность системы из-за того, как процессор обрабатывает память.

Но члены Sample2 не будут выровнены по краям двух правильных

Спасибо.

Ответы

Ответ 1

Ни одно из полей вашей второй структуры не требует 4-байтного выравнивания. unsigned char требуется только однострочное выравнивание. Следовательно, нет необходимости фактически выровнять его до 4 байтов.

Структуры обычно выравниваются только с максимальным выравниванием всех полей.

Ответ 2

data7 - это 4-байтовый элемент, поэтому компилятор обычно пытается выровнять его по адресу с кратным 4.

data1 является однобайтовым элементом, поэтому компилятор не пытается выровнять его с какой-либо конкретной границей (т.е. не будет никакого реального выигрыша от этого).

Ответ 3

Нет, в типичной реализации Sample2 не является структурой с 4-мя нотами. Это 1-байтовая выровненная структура.

В типичной реализации требование выравнивания всей структуры рассчитывается как максимум требования к выравниванию для его отдельных членов. Вот почему ваш Sample1 имеет требование выравнивания int (4 на вашей платформе), а ваш Sample2 имеет требование выравнивания unsigned char, которое равно 1.

Ответ 4

Char требует 1 байтового выравнивания. Максимальный тип данных - char, который является одним байтовым выравниванием, следовательно, вы получаете размер как "6".

Вы можете проверить этот сайт для большего понимания. http://www.geeksforgeeks.org/archives/9705. Они подробно объяснили это.