Я понимаю, что volatile предотвращает выполнение определенных (но не всех) оптимизаций переменных. Хотя документация немного запутывает эту тему (например, Википедия и MSDN противоречат), я понимаю, что volatile применяет половину памяти, которая предотвращает некоторые операции переупорядочения. (ссылка Албахари).
Я также понимаю, что это предотвращает использование регистров, что означает, что чтение никогда не может устареть из-за, например, подъема переменных в циклах.
Я также знаю из опыта, что компилятор формирует разные (недокументированные AFAIK) оптимизации для разных типов данных, делая область несколько непредсказуемой.
Однако что-то для меня остается совершенно неясным. 64-битные значения, такие как long, не могут быть украшены volatile.
Так что мой вопрос в том, как обрабатывать такие переменные, чтобы они рассматривались как эквивалент изменчивых 32-битных типов значений?
Это выглядит как несоответствие, так как я не считаю, что 32- и 64-битные значения должны рассматриваться по-разному.
EDIT
Кроме того, почему барьер памяти гарантирует, что компилятор напишет ASM, который будет извлекать значение из ОЗУ, а не из регистра? Я понимаю, почему volatile сделает это.