Зачем нужно выравнивание памяти? Точнее, почему процессор обращается 2 раза к невыравниным данным?

Прочел 10 статей, и еще пачку не успел.(Хотя тему знал). Везде написано. Одно и то же. Но нигде не нашел. А почему именно??? Типа потому что так быстрее, А вот почему быстрее
Почему short только по четным, типа что для нечетной позиции нету подходящего битового сдвига или что там?(Или это для случая что short может оказаться между границей 2 слов?)
Потом пишут, что процессор извлекает данные только по границам Word, допустим по int32, то есть может обращаться только к 0, 4, 8, 12, 16 .... данным по адресам? А там внутри, доступ к байту, через всякие сдвиги только получать. Так?
Для примера НЕ выровненной структуры. Опишите что тут будет происходить
//       0      1 ...
 //      'c'   0x01 0x02 0x03 0x04   0x88 0x77   'a'
//       char            int                          short         char
 struct pragmaA{
   char a;         
  int b;  
   short c;  
   char d;             
}

Для процессора x86 с word 32bit. Как будут выполняться fetch?
Хочу ответ в таком формате. ( на итерации на шину извлекается 4 байта)
регистр IP = 0
Прочитать char

1.IP=0; [fetch->char] bus 'c' 0x01 0x02 0x03 // извлекается 4 байта каждый раз
1.1. берем только 'c' // сдвиги битов там всякие
Далее уже только догадки.
Прочитать int
2. IP=??? IP будет 0, 1 или 4? bus=???? какие 4 байта прочтутся.
К примеру почему не может прочесть 0x01 0x02 0x03 0x04 ???
(Моя догадка, он сначала прочтет 3 байта с Адресе 0-4, а потом прочтет следующие 4 байта, и оттуда только 1 возьмет).
3??
  • Вопрос задан
  • 533 просмотра
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Для процессора x86 с word 32bit. Как будут выполняться fetch?
Хочу ответ в таком формате.

Что мешает взять спецификацию на процессор и почитать, например, раздел 5.3.6?

почему процессор обращается 2 раза к невыравненным данным?

Если посмотреть на схему i386 на первой же странице документа по ссылке выше, то можно увидеть, что шина адреса процессора имеет линии A2 - A31. Линий A0 и A1 тупо вообще нет, физически.
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Вопрос такой что отвечая на него можно новую книгу написать. Тут даже С не причем. А причем - архитектура процессора x86. Кстати тут еще надо кеш-линии рассмотреть. Это фокус такой. Что если тебе надо 1 байт прочитать
из произвольного адреса, современная архитектура этого не умеет. Она читает (обычно) кусок памяти шириной в 64 байта. Это обзывается кеш-линия. И уже из нее будет прочитан нужный байт. Отвечающие верно сказали выше. Еще можно добавить такое (условное правило) что тип данных должен лежать в сегменте данных по адресу кратному самому размеру типа. Тоесть int должен лежат на адресах кратных 4, long - 8 байт и так далее. Вот насчет MMX/SSE не знаю.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы