2011-09-21 15 views
8

La documentazione MSDN per "volatile" in Visual C++ indicare che le scritture hanno "la semantica di rilascio" e che si legge hanno "acquisire la semantica", oltre a garantire che legge sempre leggere dalla memoria e che scrive sempre scrivere di conseguenza.Visual C++ Volatile

Spec C per "volatile" comprende la seconda parte (non farlo ottimizzazioni folle), ma non la prima parte (una recinzione memoria).

C'è un modo in Visual C++ per ottenere l'unico "C" il comportamento volatile, senza la recinzione di memoria?

voglio forzare una variabile per essere sempre sulla pila, in un posto fisso, ma non voglio prendere il sovraccarico di una recinzione di memoria su ogni incarico ad esso.

C'è un modo semplice per farlo con l'origine di Visual C++?

+0

La prima parte non è un comportamento C++ standard, penso. Non sono sicuro, però. – Nawaz

+0

"Voglio forzare una variabile per essere sempre in pila, in un punto fisso" e come sarebbe "volatile" aiutare in questo? FWIW, le variabili sono * sempre * in un punto fisso. @Nawaz: no, la prima parte non è standard. –

+1

@Fernades Le variabili locali NON si trovano sempre in un punto fisso. Le variabili locali possono essere eliminate o il loro indirizzo nello stack può essere in punti diversi a seconda di dove si trova il PC. L'ottimizzatore può fare un sacco di cose pazze. Voglio sopprimere quelle ottimizzazioni. Il modo per farlo è usare "volatile". Tuttavia, non desidero la recinzione di memoria non obbligatoria da standard che Visual C++ inserisce. –

risposta

4

C'è qualche modo in Visual C++ per ottenere il comportamento volatile "C" solo, senza il recinto di memoria?

Su 86 Non ci sono recinzioni di memoria create a livello di assieme sulla legge e scrive in una posizione volatile di memoria in quanto su quella piattaforma ogni carico ha acquisire la semantica, e ogni negozio ha la semantica di rilascio. Pertanto, per MSVC su x86, la direttiva volatile semplicemente indirizza il compilatore per impedire il riordino di carichi e archivi a seconda che si stia scrivendo o leggendo dalla posizione di memoria contrassegnata come volatile.

Si incorre solo nella "penalità" di una fence di memoria sull'architettura IA64, poiché il modello di ordinamento della memoria della piattaforma non garantisce l'acquisizione e il rilascio della semantica per carichi e negozi.

Tenere presente che questo comportamento è specifico per MSVC e non è una semantica standardizzata di volatile.

Aggiornamento: Secondo @ildjarn, si vedrebbe anche una fence di memoria su ARM con Windows 8 poiché tale piattaforma ha anche un modello di consistenza di memoria debolmente ordinato come IA64.

+0

La sanzione si applica anche a ARM. – ildjarn

+0

MSVC funziona su ARM? ... Non sapevo che potevi eseguire programmi Windows su ARM ... – Jason

+0

ARM è una piattaforma primaria per Windows 8, quindi MSVC11 supporta anche ARM come architettura primaria. – ildjarn