Задать вопрос
@AslanPAPA

Как работает выравнивание памяти в С в структурах?

Есть структура:

struct  TEST {
     char s; //symbol
     int d; //digit
};

Размер этой структуры 8 байт.
ПАМЯТЬ:

9457b84a5899d4a905c2c5925535d7bb.jpg
Вот в памяти получается так будет хранится структура? Т.е., в 0 адресе переменная char s;, а потом вроде бы выравнивание, у int это 4 байт (хоть я в примере в ПАМЯТИ показал, что это самое выравнивание 3 байт). Как это работает, т.к. то что я описал, скорее всего неверно. Т.е., каждый тип должен быть не просто по какому-то адресу, а именно в кратном ему адресу? Если int = 4, то он не может располагаться в памяти НЕ кратном ему адресу?

На счёт того, что это нужно для процессора, для быстрой чего-то. Я также не понимаю, но это скорее всего уже дело глубже чем мой вопрос.
  • Вопрос задан
  • 107 просмотров
Подписаться 1 Средний 4 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Академия Эдюсон
    Разработчик игр на Unreal Engine + ИИ
    9 месяцев
    Далее
  • Stepik
    Профессия: Разработчик C++ (Junior)
    2 месяца
    Далее
Решения вопроса 1
opium
@opium
Просто люблю качественно работать
да, ты всё правильно понял, дело не в размере char/int, а в alignof — у int это обычно 4 байта. char ложится на 0, дальше 3 байта padding, и d стартует ровно с адреса кратного 4. Проверить руками просто: offsetof(struct TEST, d) из stddef.h выдаст 4. Ещё момент: размер всей структуры округляют под её же выравнивание, иначе в массиве таких структур второй элемент съедет и int снова окажется невыровненным.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
VoidVolker
@VoidVolker
Dark side eye. А у нас печеньки! А у вас?
На счёт того что это нужно для процессора, для быстрой чего-то. Я так же не понимаю, но это скорее всего уже дело глубже чем мой вопрос.

Всё просто: процессор работает с памятью не отдельными байтами, а с т.н. "машинными словами" — блоками из нескольких байт. Обычно он кратно степени двойки — 1, 2, 4, 8 и так далее. Поэтому в случае, например, если разместить в памяти число без выравнивания, то для работы с этим числом надо будет прочитать сначала одно машинное слово, сделать сдвиг байтам, чтобы разместить их в нужном порядке в регистре, затем прочитать второе машинное слово в другой регистр, в нём тоже сделать сдвиг байтов, и только после этого "склеить" байты из регистров в одном регистре. Получается надо сделать кучу операций только для того, чтобы прочитать число из памяти. И для его сохранения надо будет всё проделать в обратном порядке. Это будет не очень эффективно. Именно поэтому все данные в памяти почти всегда выравниваются. И по этой же причине обычно в структурах всегда первыми идут поля, которым не нужно выравнивание, а дальше идут уже поля, которым нужно выравнивание. Конечно, это в общем случае, а так — в современных процессорах очень много всего накрутили типа кэшей, прогнозирования ветвлений и прочее, так что там всё несколько сложнее и следует смотреть спецификации на конкретный процессор.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы