Является ли неуважение к требованиям выравнивания неопределенным поведением?

#c #alignment

#c #выравнивание

Вопрос:

Изображение, которое я разрабатываю для встроенного устройства, поэтому я напрямую взаимодействую с аппаратными адресами.

У меня есть uint16_t , и я пишу его, чтобы обратиться 0x10001 с помощью (uint16_t*)(0x10001) = myShort; .

Что происходит на практике в обычных архитектурах ? Каковы гарантии ?

Что, если я затем попытаюсь прочитать его с помощью uint16_t myShortOrIsIt = *((uint16_t*)(0x10001)); ?

Комментарии:

1. Определите «общие архитектуры». Некоторые справятся с этим, некоторые потерпят крах. Как правило, UB означает ровно ОТСУТСТВИЕ гарантий ни на что.

2. Это зависит от архитектуры. Возможности включают отсутствие проблем, снижение производительности или только наличие проблем (например, ошибка или снижение производительности), если выровненный доступ охватывает строку кэша.

3. Вам следует проверить компилятор, который вы используете для просмотра встроенной системы. Также посмотрите на сгенерированный код сборки для проверки. Мобильность имеет второстепенное значение.

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

5. @Eljay Как бы помогло это кодирование на ассемблере?