Выравнивание адреса памяти - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Прочитал на разных ресурсах про выравнивание адреса данных, но многое ещё не понятно. Чего я понял: Выравнивание адреса нужно для того что бы снизить количество обращений процессором к памяти для считывания хранимых данных Чем больше объем данных адрес которых нуждается в выравнивании, тем больше усилий процессор прилагает что бы получить данные по невыровненному адресу Не все процессоры умеют выравнивать адрес памяти самостоятельно Чего я не понял: Увидел следующее утчерждение: Адрес данных должен быть кратен размеру считываемых данных. Как программист может повлиять на кратность адреса, если выделением адреса данных занимается компилятор и этот процесс насколько понимаю выходит за пределы программного кода? Некоторые компиляторы сами занимаются выравниванием адресов(дополняя данные адреса нулями) что бы можно было считать блок данных за минимальное количество обращений процессором к памяти. Именно не понятно, зачем забивать данные нулями Прошу помочь разобраться
И ещё не ясно что приводит к "кривости" памяти которую потом приходится выравнивать
Пока бродил по инету, нашел пример где структура с одинаковыми полями занимает разный объем в памяти в зависимости от последовательности типов в структуре. Это тоже как то связано с выравниванием данных? http://rextester.com/WLM62012 24 байта http://rextester.com/UKWSN11327 16 байта
Кажется начал понимать почему заполняются нулями данные. Похоже дело в том, что каждый процессор может прочитать только определенное количество данных за одно обращение к памяти. Допустим, это число равно 4. Когда процессор читает char, нельзя позволить что бы он прочитал 1 байт который относится к char и 3 байта от других данных. Поэтому к char будут добавлены нули, что бы свести общий размер данных к 4. Если это так, то почему char a = 'b'; printf("%zu", sizeof(a)); равно 1, а не 4? В то время как внутри структуры из примера выше заполнение нулями есть(это определил потому что размер структуры превышает тот размер которого достаточно для хранения его данных)
то время как внутри структуры из примера выше заполнение нулями есть
Выходит о выравнивании данных нужно заботиться только в том случае, когда в непрерывной области памяти находятся данные разных типов? Как например структуры, или массив функций которые возвращают значения разного типа? (Массив функций возвращаемое значение которых есть указатель на void*)

Решение задачи: «Выравнивание адреса памяти»

textual
Листинг программы
/* Handle the first few characters by reading one character at a time.
     Do this until CHAR_PTR is aligned on a longword boundary.  */
  for (char_ptr = str; ((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0;
       ++char_ptr)
    if (*char_ptr == '\0')
      return char_ptr - str;
 
  /* All these elucidatory comments refer to 4-byte longwords,
     but the theory applies equally well to 8-byte longwords.  */
 
  longword_ptr = (unsigned long int *) char_ptr;

Объяснение кода листинга программы

  1. В данном коде реализуется алгоритм выравнивания адреса памяти.
  2. Переменная str содержит исходную строку.
  3. Переменная char_ptr является указателем на текущий символ в строке.
  4. Переменная longword_ptr является указателем на текущий longword в строке.
  5. В цикле происходит последовательное чтение символов из строки до тех пор, пока указатель на текущий символ не будет выровнен по границе longword (т.е. до тех пор, пока значение указателя не будет кратно размеру longword).
  6. Если текущий символ является нулевым, то возвращается его индекс в строке.
  7. Комментарии в коде относятся к 4-байтным longword'ам, но алгоритм применим и к 8-байтным longword'ам.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5
Похожие ответы