По моим сведениям, по умолчанию будет выполнено 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 не будут выровнены по кратным двум правильным?
Благодарю.
Ни одно из полей в вашей второй структуре не требует 4-байтного выравнивания. unsigned char
требуется только 1-байтовое выравнивание. Поэтому нет необходимости фактически выровнять его до 4 байтов.
Структуры обычно выравниваются только с максимальным выравниванием всех полей.
data7
– это 4-байтовый элемент, поэтому компилятор обычно пытается выровнять его с адресом, кратным 4.
data1
– однобайтовый элемент, поэтому компилятор не будет пытаться согласовать его с какой-либо конкретной границей (т. е. от этого не будет никакого реального эффекта).
Нет, в типичной реализации Sample2
не является структурой с 4-мя нотами. Это 1-байтовая выровненная структура.
В типичной реализации требование выравнивания всей структуры рассчитывается как максимум требования к выравниванию для его отдельных членов. Вот почему ваш Sample1
имеет требования к выравниванию int
(4 на вашей платформе), а ваш Sample2
имеет требование выравнивания unsigned char
, которое равно 1.
Для Char требуется 1 байт. Максимальный тип данных – char, который является одним байтовым выравниванием, поэтому вы получаете размер как «6».
Вы можете проверить этот сайт для большего понимания. http://www.geeksforgeeks.org/archives/9705 . Они объяснили это подробно.