Пример кода C, который демонстрирует неустойчивость при parsingке?

Что такое короткая иллюстративная программа на С, которая демонстрирует разницу между изменчивыми и нелетучими при parsingке?

т.е.

int main() { volatile int x; ??? } 

против

 int main() { int x; ??? } 

Что мы можем заменить ??? с тем, что сгенерированный код отличается?

например:

 x = 0; 

Если x не является volatile , компилятор увидит, что он не используется и, вероятно, исключит его (либо оператор x = 0; либо даже сама переменная) полностью из сгенерированного кода в качестве оптимизации.

Однако ключевое слово volatile точно предназначено для предотвращения компилятора от этого. Он в основном говорит генератору кода: «что бы вы ни думали, что эта переменная / делает, не вторгайте мне, мне это нужно». Таким образом, компилятор будет обрабатывать изменчивую переменную как доступную, и она испустит фактический код, соответствующий выражению.

Это может быть не самый короткий пример, но это распространенное использование volatile во встроенных системах , если x указывает на адрес регистра, если volatile не используется, компилятор будет считать, что значение x не изменяется и будет удаляться петля:

 volatile long *x = (long*) REGISTER_BASE; while (!(x&0x01)) { //do nothing; } 

Вы также можете попробовать следующее:

 x=1; x=2; return x; 

Включите оптимизацию, проверьте parsingку для обоих.