Рейтинг:
20
OriginalGriff
Просто: короткий int равен двум байтам-и это означает, что его адрес должен начинаться с двухбайтовой границы. Поэтому, когда у вас есть один символ перед ним, дополнительный байт добавляется в качестве дополнения, чтобы довести целое число до соответствующего адреса. Аналогично, заполнение применяется для "округления" всей структуры до соответствующей границы (или массив из них будет смещен в каждом втором экземпляре).
Измените его на этот:
struct structure1
{
char _1;
char _3;
short int _2;
};
и это будет 4 байта.
Gowtham Gampala
Но компилятор всегда читает 4 байта правильно!!
4 + 4 это означает, что 2 байта какого-то другого адреса также будут прочитаны правильно!!
OriginalGriff
Почему ты так думаешь?
Процессор будет-или, скорее всего, 8 байт, или даже 16 (больше в некоторых случаях, если Оперативная память имеет "пакетный режим", который делает это более эффективным) и хранит их во внутреннем кэше (переменной ширины) на случай, если они понадобятся позже.
И в зависимости от использования он может даже не попасть в память - он может быть переведен во внутренние регистры процессора и остаться там!
Это ужасно сложно, но есть много того, что называется предварительной загрузкой, когда вы смотрите на то, что делает современный процессор во имя эффективности-и это не обязательно кажется эффективным, если смотреть изолированно.
Gowtham Gampala
#include < stdio.h>
#include & lt;string.h>
/ * Ниже structure1 и structure2 одинаковы.
Они различаются только расположением членов */
//#pragma pack ( 1 )
структура structure1
{
короткий int _1;
инт _2;
короткий int _3;
};
тап_п()
{
структура structure1 a;
printf ("размер структуры 1 в байтах: %d\n", sizeof(a));
printf ("\n адрес id1 = %u", & a. _1 );
printf ("\n адрес id2 = %u", & a. _2 );
printf ("\n адрес имени = %u", & a. _3 );
функция getchar();
возвращает 0;
}
Это означает, что размер этой структуры должен быть 10 байт правильно!Но это же 12 байт!!
OriginalGriff
И ваша модифицированная версия: Нет, это не 10 байт, это двенадцать.
короткий-2 байта
заполнение-2 байта для приведения адреса к границе 4 байта
int - 4 байта
короткий-2 байта
заполнение-2 байта, чтобы вся структура выровнялась по 4-байтовой границе.
Gowtham Gampala
Спасибо вам сэр :)
Gowtham Gampala
Это яркое объяснение!!
Gowtham Gampala
Сэр, пожалуйста, объясните и это..
согласно вашему объяснению
char 1byte +(3, чтобы сохранить int в 4-байтовой границе)
int 4 байта и
char занимает 4 байта или 2 байта??
структура structure1
{
чар _1;
инт _2;
чар _3;
};
OriginalGriff
char-1
pad-3
инт-4
char-1
pad-3
Итого= 12 байт.
Gowtham Gampala
Как это изменится, если это 16-битный компилятор??
OriginalGriff
Зависит от целевого процессора. Некоторые из меньших могут обращаться к целым числам на нечетных адресных байтовых границах.
Серьезно: перейдите по ссылке CPallini, и вы узнаете больше, чем вам когда-либо нужно будет знать! :смеяться: