Да, вы можете это сделать (если вы знаете, что можете уйти от него).
Одна из причин, по которым вы не сможете избежать этого, заключается в том, что если память назначения, которую вы пишете, находится в защищенных областях только для чтения (таких как постоянные данные), тогда вы получите нарушение доступа. Например, любой const во время компиляции, который заканчивается секциями данных только для чтения исполняемого файла. Большая часть поддержки платформы защищает его от записи во время выполнения.
В основном этого не делают.
Есть и другие проблемы с вашим примером, которые, вероятно, не делают его лучшей демонстрацией. Например, для перезагрузки * a во втором printf компилятор может оптимизировать его! (он знает, что «а» не изменился, он знает, что «а» указывает на константу, поэтому ему не нужно перезагружать память, предварительно формируя нагрузку на память для выражения «2 *», она может повторно использовать значение, которое, вероятно, имеет в регистре с 1-го раза загружен «* a»). Теперь, если вы добавите барьер памяти между ними, ваш пример будет работать лучше.
https://en.wikipedia.org/wiki/Memory_barrier GCC? asm volatile (""::: "memory"); // может работать до 2-го отпечатка
Но главный вопрос, который вы задали, да, вы можете это сделать, если знаете, что делаете в других вещах.
@this fyi не уверен, почему ваш ответ получил downvoted –
Потому что некоторые голоса основаны на статусе других ответов вместо их знаний. «Логика» звучит так: так как был еще один ответ с отрицательным ответом, говорящий «да», поэтому мой ответ также должен быть неправильным. Еще одно объяснение состоит в том, что кто-то просто ошибается и просто очень ревностный избиратель. – this
Парень, задающий вопрос, опустил 3 очка с тех пор, как спросил его, поэтому я думаю, что они занижены, если вы потеряете 1 очко за клик. –