Кстати, семантика volatile
зависит от платформы / компилятора. В некоторых компиляторах, таких как MSVC с архитектурой IA64, ключевое слово volatile
не только запрещает компилятору переупорядочивать операции, оно также выполняет каждую операцию чтения / записи с семантикой получения / выпуска, то есть в действительности существует операция с барьером памяти. GCC, с другой стороны, не позволяет компилятору переупорядочивать операции до / после чтения / записи в энергозависимую область памяти ... на платформах с моделями со слабой памятью семантика захвата-выпуска не поддерживается, как с MSVC.
Теперь на x86, из-за его модели памяти со строгим упорядочением, наличие барьеров памяти при использовании ключевого слова volatile
не является проблемой, поэтому основным наказанием будет просто отсутствие переупорядочения и другие оптимизации, которые могут быть выполнены компилятором. Тем не менее, это будет зависеть от того, как выглядит ваш код. Например, если в вашем коде имеется замкнутый цикл, а определенные volatile
-качественные переменные на самом деле являются инвариантами цикла, вы не получите некоторые из оптимизаций, которые мог бы выполнить компилятор, если бы эти области памяти были определены как не-volatile
.