Ну да, всё правильно. А как это противоречит тому, что я говорил? Я всего-лишь показал, что если компилятор сразу видит, что адрес невыровненный, то он компилирует побайтную запись. Но если как в случае с ТС, компилятор этого не знает, то генерируется оптимальный код, который падает при подаче в невыровненного указателя.
Куда в этом корректном примере запишется последний байт?
jcxz писал(а):
Т.е. - volatile в случае GCC никак не спасает от исключения невыровненного доступа. Не поможет оно.
Оно помогает для uint32_t*. Когда их несколько подряд, то без volatile может сгенериться STRD, но это чисто практическое наблюдение... Вообще в случае невыровненного доступа рекомендуют memcpy использовать, она должна везде и всегда нормально работать.
Т.е. - volatile в случае GCC никак не спасает от исключения невыровненного доступа. Не поможет оно.
В моём случае я использовал volatile только для подавления оптимизации, чтобы гарантированно сгенерировался код записи по адресу. Без него оптимизатор всё выкинет и будет пустая программа
Афигеть Вам нужно пересесть на Arduino там этот вопрос элегантно решили. Суть решения проста как я и говорил "если нельзя, но очень хочется то можно" ...
P.S. А, глубокомысленно решать вопрос как "И рыбку съесть и на-й сесть" это тупик
_________________ "Every profession is a conspiracy against the uninitiated" (B. Shaw) "A textbook can be defined as a book unsuitable for reading" (B. Shaw) Tautology is humor in "this" place (Vigo Carpathian)
Последний раз редактировалось astrahard Пн сен 27, 2021 13:00:25, всего редактировалось 1 раз.
Куда в этом корректном примере запишется последний байт?
"Корректный", это не о том как будет исполняться, а о том чтобы соответствовало вопросу в теме. В примере ArtDen компилятор видит, что целевой объект - байтовый массив. Возможно поэтому формирует такую портянку из STRB (используя эту инфу). В моём примере у компилятора такой инфы нет, для него цель - просто некая 64-битная переменная где-то, содержимого которой он не знает.
В примере ArtDen компилятор видит, что целевой объект - байтовый массив. Возможно поэтому формирует такую портянку из STRB (используя эту инфу)
Для компилятора важна лишь инфа, достоверно невыровнен ли адрес или это неизвестно. Не важно, что именно до этого содержалось по этому указателю. Вот пример с сырыми указателями: https://gcc.godbolt.org/z/hTeGcv73v
Последний байт запишется корректно, потому что адрес &aaa+1 выровненный, т.к. у aaa тип uint64_t ))
Ну да, это я протупил, там же приведения нет, потому все байты запишутся непонятно куда Но изначально видимо протупил jcxz, потому что скорее всего хотел увеличить адрес именно на байт
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения