Найти в Дзене
D21nk Master

Проблемы со счётом у компилятора

Что такое структуры мы знаем,как с ними более комфортно работать-тоже.Казалось бы,что ещё нужно? Си готов преподнести вам ещё парочку сюрпризов. Перед дальнейшим прочтением попробуйте собрать такой код: struct { char ch; int tmp1; short tmp2; }typedef mystu; int main() { mystru tmp; printf("%d\n",sizeof(tmp)); return 0; } Любопытное число,правда? Получается наша структура занимает 12 байт в памяти,создаётся впечатление,что компилятор получал двойки в первом классе и так и не освоил сложение.Давайте посчитаем за него: char занимает 1 байт; int занимает 4 байта; short занимает 2 байта; Всего должно получиться 7 байт,откуда 12?! Сплошная мистика,попробуйте пересобрать программу с такой структурой: struct { char ch; short tmp2; int tmp1; }typedef mystru; Здорово,правда? Мы всего лишь поменяли местами пару переменных в структуре,а она уже занимает на целых 4 байта меньше.А теперь,когда я вас заинтересовал самое время продать вам полную версию этого у

Что такое структуры мы знаем,как с ними более комфортно работать-тоже.Казалось бы,что ещё нужно? Си готов преподнести вам ещё парочку сюрпризов.

Перед дальнейшим прочтением попробуйте собрать такой код:

struct

{

char ch;

int tmp1;

short tmp2;

}typedef mystu;

int main()

{

mystru tmp;

printf("%d\n",sizeof(tmp));

return 0;

}

Любопытное число,правда? Получается наша структура занимает 12 байт в памяти,создаётся впечатление,что компилятор получал двойки в первом классе и так и не освоил сложение.Давайте посчитаем за него:

char занимает 1 байт;

int занимает 4 байта;

short занимает 2 байта;

Всего должно получиться 7 байт,откуда 12?!

Сплошная мистика,попробуйте пересобрать программу с такой структурой:

struct

{

char ch;

short tmp2;

int tmp1;

}typedef mystru;

Здорово,правда?

Мы всего лишь поменяли местами пару переменных в структуре,а она уже занимает на целых 4 байта меньше.А теперь,когда я вас заинтересовал самое время продать вам полную версию этого урока объяснить что к чему.

Всё просто,компилятор,при сборке собирает структуры так,что каждый тип данных размещается в адресе кратный ему же.Звучит не очень просто,поэтому обратимся к вашим любимым аллегориям.

Вы риелтор,вам необходимо разместить людей в одном квартале.В один дом въезжает лишь один человек,в другой два человека,а в третий четыре человека.Все дома имеют одинаковое количество комнат,так что для экономии места можно было бы одного жильца поселить с двумя,но это мало кого бы устроило.

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

Если тип char разместится на адресе 0х0001,то типу short нужно размещаться на адресе кратному двум,как вы помните он занимает 2 байта в памяти.Следовательно,выделяется один пустой байт под эти нужды.Собственно поэтому во втором варианте структура занимает 8 байт,а не 7.

Выглядит это всё так:

[char] 0x000

[ПУСТО] 0x001

[short] 0x002

[short] 0x003

[ int ] 0x004

[ int ] 0x005

[ int ] 0x006

[ int ] 0x007

То есть наш int мы разместили как раз на числе кратному 4 и всё замечательно.

На этом конечно же тема с экономией памяти в структурах ещё не исчерпана,на этом мы пока остановимся.В следующей статье я покажу вам несколько приёмов со структурами,о которых так же не многие знают.

С вами был D21nkMaster.Всего доброго!