После being bitten by stack alignment problems Я начал задаваться вопросом, должна ли куча быть выровнена с 8-октетными границами.ARM Cortex-M выравнивание кучи
ARM Cortex EABI заявляет, что для всех вызовов внешних функций стек должен быть 8-выровнен. Я не мог найти никакой информации о том, существуют ли какие-либо ограничения на выравнивание кучи. Похоже, что есть некоторые подсказки, указывающие на то, что куча также должна быть выровнена на 8, но наиболее общедоступный код управления памятью выравнивает ее на 4.
Требование выравнивания стека не должно иметь ничего общего с выравниванием кучи (до тех пор, пока соблюдаются границы слов), поскольку выравнивание не сохраняется при копировании между кучей и стеком. Кроме того, я не могу думать о какой-либо причине, по которой компиляторы должны быть ограничены 8-кратными указателями при указании на элементы с 8 октетами.
Может ли кто-нибудь подтвердить, что для кучи достаточно 4-октетного выравнивания?
Из этого ответа я не понимаю, почему куча должна быть выровнена с 8 байтами. Поскольку ** словосочетание используется для слова, двойного слова или множественного доступа к словарю **, достаточно выровнять до 4 байтов. Почему они используют выравнивание по 8 байт? Как и я, этот пост не является ответом. – kyb
Оригинальный вопрос и мой ответ относятся к Cortex-M, где 4-байтовое выравнивание достаточно для любого использования, потому что процессорное ядро никогда не требует более строгого выравнивания для любых доступов. Существуют другие архитектуры ядра процессора, где это необходимо с более строгим выравниванием для обеспечения правильного доступа ко всем возможным типам, которые код может использовать в выделенной памяти. Поэтому вы можете столкнуться с реализацией кучи, которые имеют более строгуюровность. – thomasthorsen