Pregunta

Estoy buscando en este fragmento de texto en el documentación para Visual C ++ 's _ReadWriteBarrier intrínseca:

  

En las versiones anteriores de la Visual C ++   compilador, el _ReadWriteBarrier y   _WriteBarrier funciones se aplican sólo a nivel local y no afectaban   funciones hasta el árbol de llamadas. en Visual   C ++ 2005 y posteriores, estas funciones   se hacen cumplir todo el camino hasta la llamada   árbol.

entiendo lo que hace la barrera dentro de una función, pero el "el árbol de llamadas" parece implicar que un foo() función de llamar a una función bar() puede saber si bar() contiene una barrera o no. Lo que realmente cambiado en VC2005 para habilitar esta ... la convención de llamada / ABI, algunos análisis global realizado por el compilador, o qué?

¿Fue útil?

Solución

docs

MS no son grandes, y éste es un buen ejemplo de ello. Hay 2 partes a la _ReadWriteBarrier:

  1. diciendo la CPU para hacer una barrera de memoria (es decir mfence),
  2. diciendo que el compilador no para optimizar alrededor de la barrera.

sospecho que la parte árbol de llamadas se refiere a # 2. es decir:

int x = 0;

void foo()
{
   x = 7;
   _ReadWriteBarrier();
   x = 8;
}

Sin la barrera, x = 7 se puede quitar completamente por el compilador. Con la barrera, se queda. Ahora, ¿qué pasa con una función que llamadas foo?

void bar()
{
   x = 3;  // optimized away?
   foo();
   x = 4;
}

Creo que en el pasado x = 3 podrían haber sido optimizado de distancia (que puede ser difícil para el compilador para decir si que está permitido o no), pero ahora a seguir correctamente las x = 3 instrucciones.

Creo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top