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

Зачем нужно выравнивание (ассемблерного) кода при компиляции (линковке)?

Вот написал я кое-какой код, на С`ях например. Скормил компилятору, получил бинарник (executable). Почему компилятор (или может линковщик) дописывает NOP'ы после функций, что бы функции начинались с адресов, кратным какому-то числу?

Я вот понимаю можно так хранить данные на жестких дисках, округлять до секторов, дорожек или чего-то такого, но вот в оперативной памяти доступ к любому участку занимает одинаковый промежуток времени, по этому не понимаю смысла округлять адреса функций.
  • Вопрос задан
  • 811 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Зачем нужно выравнивание (ассемблерного) кода

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

Нет.
Ответ написан
Комментировать
@abcyu
Разработчик
Если бы дело было давным-давно (даже не в конце прошлого века, а пораньше), то вы были бы правы.

Ширина шин данных давно уже не 8 бит. А существенно побольше.
Обращение к оперативной памяти происходит более крупными кусками.
И только крупными кусками.

ssd.sscc.ru/sites/default/files/content/attach/317...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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