Я понимаю, что volatile
сообщает компилятору, что значение может быть изменено, но для выполнения этой функции компилятор должен ввести забор памяти, чтобы заставить его работать?
По моему мнению, последовательность операций над неустойчивыми объектами не может быть переупорядочена и должна быть сохранена. Это, по-видимому, означает, что необходимы некоторые ограждения памяти и что на самом деле это не так. Правильно ли я это говорю?
Есть интересное обсуждение в этом связанном вопросе
... Доступ к отдельным изменчивым переменным не может быть переупорядочен компилятор, если они встречаются в отдельных полных выражениях... right что волатильность бесполезна для безопасности потоков, но не по причинам, которые он дает. Это не потому, что компилятор может переупорядочить обращения но из-за того, что ЦП может их переупорядочить. атомное операции и блоки памяти препятствуют компилятору и процессору переупорядочения
На что Дэвид Шварц отвечает в комментариях:
... Нет никакой разницы, с точки зрения стандарта С++, между компилятором, выполняющим что-то, и компилятором, испускающим инструкции, которые заставляют аппаратное обеспечение что-то делать. Если ЦП может переупорядочивает доступ к летучим, тогда стандарт не требует, чтобы их порядок сохранится....
... В стандарте С++ нет никакого различия в том, что делает переназначения. И вы не можете утверждать, что CPU может переупорядочить их без наблюдаемый эффект, так что все в порядке - стандарт С++ определяет их как наблюдаемый. Компилятор совместим со стандартом С++ на платформу, если она генерирует код, который заставляет платформу делать то, что стандарт требует. Если стандарт требует доступа к летучим переупорядочиваться, тогда платформа, которая их переупорядочивает, не соответствует требованиям....
Я хочу сказать, что если стандарт С++ запрещает компилятору переупорядочение доступа к отдельным летучим веществам, о том, что порядок таких доступов является частью наблюдаемого поведения программы, то он также требует от компилятора испускать код, который запрещает использование ЦП от этого. В стандарте нет различий между компилятор делает и то, что компилятор генерирует код, делает CPU.
Что дает два вопроса: является ли одно из них "правильным"? Что действительно делают реальные реализации?