2011-09-21 23 views
8

Los documentos de MSDN para "volátil" en Visual C++ indican que las escrituras tienen "semántica de lanzamiento" y que las lecturas tienen "semántica de adquisición", además de garantizar que las lecturas siempre se leen de memoria y que las escrituras siempre escriben en consecuencia.Visual C++ Volátil

La especificación C para "volátil" incluye la segunda parte (no realice optimizaciones locas), pero no la primera parte (una valla de memoria).

¿Hay alguna forma en Visual C++ para obtener el comportamiento volátil "C" solamente, sin la valla de memoria?

Quiero forzar una variable para que siempre esté en la pila, en un lugar fijo, pero no quiero tomar la sobrecarga de una valla de memoria en cada asignación a la misma.

¿Hay alguna manera fácil de hacerlo con la fuente de Visual C++?

+0

La primera parte no es el comportamiento estándar de C++, creo. Aunque no estoy seguro. – Nawaz

+0

"Quiero forzar una variable para que siempre esté en la pila, en un lugar fijo" y ¿cómo podría ayudar 'volátil 'con eso? FWIW, las variables son * siempre * en un punto fijo. @Nawaz: no, la primera parte no es estándar. –

+1

@Fernades Las variables locales NO siempre están en un lugar fijo. Las variables locales se pueden eliminar, o su dirección en la pila puede estar en diferentes lugares dependiendo de dónde esté la PC. El optimizador puede hacer muchas cosas locas. Quiero suprimir esas optimizaciones. La forma de hacerlo es usar "volátil". Sin embargo, no quiero que la valla de memoria no ordenada por el estándar que ofrece Visual C++. –

Respuesta

4

¿Hay alguna forma en Visual C++ de obtener el comportamiento volátil "C" solamente, sin la valla de memoria?

en x86 no hay vallas de memoria creados en el nivel de ensamblado en lectura y escritura a una ubicación de memoria volatile ya en esa plataforma de cada carga tiene adquirir la semántica, y cada tienda tiene la semántica de liberación. Por lo tanto, para MSVC en x86, la directiva volatile simplemente dirige el compilador para evitar el reordenamiento de las cargas y las tiendas dependiendo de si está escribiendo o leyendo desde la ubicación de la memoria marcada como volatile.

Solo incurrirá en la "penalización" de una valla de memoria en la arquitectura IA64, ya que allí el modelo de ordenación de memoria de la plataforma no garantiza la semántica de adquisición y liberación para cargas y almacenes.

Tenga en cuenta que este comportamiento es específico de MSVC y no es una semántica estandarizada de volatile.

Actualización: De acuerdo con @ildjarn también vería una valla de memoria en ARM con Windows 8 ya que esa plataforma también tiene un modelo de coherencia de memoria débilmente ordenado como IA64.

+0

La multa también se aplica a ARM. – ildjarn

+0

¿MSVC funciona en ARM? ... No sabía que podía ejecutar programas de Windows en ARM ... – Jason

+0

ARM es una plataforma primaria para Windows 8, por lo que MSVC11 también admite ARM como arquitectura principal. – ildjarn