Документы MS никогда не бывают хорошими, и этот пример тому хороший. В _ReadWriteBarrier есть две части:
- говорит процессору сделать барьер памяти (т.е. mfence),
- говорит компилятору не оптимизировать вокруг барьера.
Я подозреваю, что часть дерева вызовов относится к # 2. то есть:
int x = 0;
void foo()
{
x = 7;
_ReadWriteBarrier();
x = 8;
}
Без барьера компилятор может полностью удалить x = 7. С барьером это остается.
А как насчет функции, которая вызывает foo?
void bar()
{
x = 3; // optimized away?
foo();
x = 4;
}
Я думаю, что в прошлом x = 3 мог быть оптимизирован (что может быть трудно для компилятора, определить, разрешено это или нет), но теперь он будет правильно выполнять инструкции x = 3.
Я думаю.