Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Что такое "volatile int" - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Слишком много аргументов http://www.cyberforum.ru/cpp-beginners/thread873862.html
Добрый вечер. Выдает ошибку у Epsilon что много аргументов, а также пишет что sqrt перегружен. Как исправить? double xnach,xkonec,epsilon,delta,newdel,xkn,x,i,ideal,a; int _tmain(int argc,...
C++ С++ сортировка массива структур Разработать программу, реализующую сортировку массива структур (50 элементов). В качестве элемента массива выбрать структуру, соответствующую индивидуальному варианту. Предусмотреть заполнение... http://www.cyberforum.ru/cpp-beginners/thread873859.html
C++ Цикл с предусловием
помогите, плиз) это код для похожей задачи. для этой #include <iostream> #include <cmath> using namespace std; int main() {
C++ Разработать программу вычисления площади заданной фигуры
Тема. Пользовательские функции. Форматированный вывод. Задание. Разработать программу вычисления площади заданной фигуры (вычисления определенного интеграла), используя три различных метода...
C++ Идентификатор "ofstream" не определен http://www.cyberforum.ru/cpp-beginners/thread873849.html
Здравствуйте, такой вопрос, как может такое быть, что ofstream не определен, если все подключено
C++ Моделировать процесс обучения студентов с помощью сетей Петри моделировать процесс обучения студентов с помощью сетей Петри и с помощью С++ написать программу, имитирующую работу этой модели.помогите может есть пример в программе подробнее

Показать сообщение отдельно
Убежденный
Системный программист
Эксперт С++
15619 / 7128 / 1128
Регистрация: 02.05.2013
Сообщений: 11,570
Записей в блоге: 1
Завершенные тесты: 1
22.05.2013, 11:20
Ключевое слово volatile может иметь немного разный смысл на разных компиляторах и архитектурах.

В Visual C++ оно имеет следующие свойства:

1) Уберегает volatile-переменную от агрессивной оптимизации компилятора.
Например, в результате оптимизации компилятор мог бы поместить переменную в
регистр, и тогда ее изменения были бы не видны другим потокам (т.к. у каждого
потока свой набор регистров). volatile защищает от этого, заставляя компилятор
каждый раз при обращении к volatile-переменной генерировать чтение и запись в
соответствующую ячейку памяти, даже если это явно невыгодно и связано с
потерей эффективности. Это называется видимость (visiblilty). Форсирование
чтения и запись в память при обращении к volatile-объекту чрезвычайно важно
для одного из пунктов ниже.

2) Ставит барьер компилятора (compiler barrier).
Компилятор не переупорядочивает обращения к volatile-переменным.
В результате, если мы пишем "int volatile a = 100; int volatile b = 200;",
то можем быть уверенными, что в сгенерированном коде запись в "a"
гарантированно будет находиться до записи в "b". Аналогичного эффекта
можно достичь, применяя специальные макросы - _ReadBarrier, _WriteBarrier и
_ReadWriteBarrier. Подчеркну, что это лишь компиляторный барьер, на
уровне CPU все равно возможно переупорядочивание (см. ниже).

3) Чтение и запись в volatile-переменную ставит неполный барьер памяти на
архитектурах IA-32 и AMD64 (acquire and release semantics). Это, так сказать,
небольшой, но приятный побочный эффект volatile, благодаря которому в некоторых
случаях можно обойтись без установки явных барьеров памяти - mfence, xchg и т.п.
Барьеры памяти, если кто не в курсе, нужны, чтобы гарантировать порядок доступа к
памяти на уровне CPU. Например, на упомянутых архитектурах последовательность
операций write-read может быть выполнена, как read-write, и код, который от этого
порядка зависит, может поломаться. Если интересует, могу дать несколько ссылок.

4) Вопреки распостраненному мнению, volatile не обеспечивает атомарности, он
связан лишь с видимостью.
Например, на 32-битных архитектурах доступ к 64-битной переменной не атомарен, и
volatile здесь не помощник.
Иллюстрация:
C++
1
2
3
4
5
6
7
8
9
#include <Windows.h>
 
__int64 volatile g_Value;
 
int main()
{
    g_Value = 0xAAAABBBBCCCCDDDD;
    return 0;
}
Сгенерированный ассемблерный код:
_main PROC

; 11 : g_Value = 0xAAAABBBBCCCCDDDD;

mov DWORD PTR ?g_Value@@3_JC, -858989091 ; ccccddddH
mov DWORD PTR ?g_Value@@3_JC+4, -1431651397 ; aaaabbbbH

; 12 : return 0;

xor eax, eax

; 13 : }

ret 0
_main ENDP
_TEXT ENDS
END
Между двумя mov запросто может кто-нибудь вклиниться.
15
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru