Nikolay_Po (05.07.2018 22:11, просмотров: 445) ответил sladkoejka на не нужно ничего выдумывать. Логика стандарта проста. Если объект никому не доступен, его можно удалять для оптимизации, т.к. это никак не повлияет на поведение системы. volatile действует только на данные, которые могут быть кому-то потенциально
Интересное вышло обсуждение. Ранее не задумывался, но мне близка позиция Сладкоежки. Эффект от исполнения кода наступает лишь в двух случаях: а) когда результат выполнения используется другим кодом;
б) когда результат выполнения чем-то управляет аппаратно, периферией или самим процессором.
Лишь в этих случаях есть смысл сохранять значения переменных и соблюдать порядок обращений к регистрам и памяти.
В случае "а" переменная должна быть доступна другому коду. То есть, она уже не может быть локальной по отношению к исполняемому блоку. В случае "б" есть побочный эффект. И выкинуть этот эффект компилятор не может, так как есть обращение к железу (в данном примере инструкция для CPU). Обратите внимание, что в заголовочных файлах регистры периферии, процессора, специальные адреса памяти всегда объявляются глобальными. Поэтому могу согласиться, что волатильность влияет лишь на возможность кэширования значения компилятором, но не должна исключать оптимизацию вплоть до удаления.
Наоборот, объявляя по необходимости то там, то там, переменные как volatile, я переживаю: "А не лишаю ли я компилятор возможностей оптимизации?". С этой точки зрения мне нравится подход, когда не переменная объявляется volatile, а обеспечивается практически значимый побочный эффект.