2011-09-21 14 views
8

Dokumenty MSDN dla "volatile" w Visual C++ wskazują, że zapisy mają "semantykę wydania" i że odczyty mają "nabycie semantyki", oprócz zapewnienia, że ​​odczyty zawsze będą czytać z pamięci i że zapisy zawsze będą odpowiednio zapisywane.Visual C++ Volatile

Specyfikacja C dla "volatile" zawiera drugą część (nie rób szalonych optymalizacji), ale nie pierwszą część (zapora pamięciowa).

Czy jest jakiś sposób w Visual C++, aby uzyskać tylko "C" zachowanie niestabilności, bez zapory pamięci?

Chcę wymusić, aby zmienna zawsze znajdowała się na stosie, w ustalonym miejscu, ale nie chcę brać na siebie napotkanej pamięci przy każdym przypisaniu do niej.

Czy jest jakiś łatwy sposób to zrobić ze źródłem Visual C++?

+0

Pierwsza część nie jest standardowym zachowaniem C++, jak sądzę. Nie jestem jednak pewien. – Nawaz

+0

"Chcę zmusić zmienną, aby zawsze była na stosie, w ustalonym miejscu" i jak "ulotna" mogłaby w tym pomóc? FWIW, zmienne są * zawsze * w ustalonym miejscu. @Nawaz: nie, pierwsza część nie jest standardowa. –

+1

@Fernades Zmienne lokalne NIE są zawsze w ustalonym miejscu. Zmienne lokalne można wyeliminować, lub ich adres na stosie może znajdować się w różnych miejscach w zależności od tego, gdzie znajduje się komputer. Optymalizator może zrobić wiele szalonych rzeczy. Chcę stłumić te optymalizacje. Aby to zrobić, użyj "volatile". Nie chcę jednak nieobsługiwanego przez standardowego zapory pamięci, do której wrzuca program Visual C++. –

Odpowiedz

4

Czy jest jakiś sposób w Visual C++, aby uzyskać tylko "C" zachowanie niestabilności, bez zapory pamięci?

Na x86 nie ma ogrodzenia pamięci utworzonych na poziomie montażu na odczytuje i zapisuje do lokalizacji volatile pamięci, ponieważ na tej platformie każdy ładunek musi nabyć semantykę, a każdy sklep ma semantykę uwalniania. Dlatego dla MSVC na x86, dyrektywa volatile po prostu kieruje kompilatorem, aby zapobiec zmianie kolejności ładunków i sklepów w zależności od tego, czy piszesz lub czytasz z lokalizacji pamięci oznaczonej volatile.

Użytkownik poniósłby jedynie "karę" za ogrodzenie pamięci w architekturze IA64, ponieważ model zamawiania pamięci platformy nie zapewnia semantyki pozyskiwania i uwalniania dla obciążeń i zapasów.

Należy pamiętać, że to zachowanie jest specyficzne dla MSVC i nie jest znormalizowaną semantyczną z volatile.

Aktualizacja: Według @ildjarn będzie można również zobaczyć ogrodzenie pamięci na ARM z Windows 8, ponieważ że platforma ma również słabo uporządkowanego modelu pamięci konsystencji IA64.

+0

Kara dotyczy również ARM. – ildjarn

+0

Czy MSVC działa na ARM? ... Nie wiedziałem, że możesz uruchamiać programy Windows na ARM ... – Jason

+0

ARM jest podstawową platformą dla Windows 8, więc MSVC11 obsługuje ARM również jako podstawową architekturę. – ildjarn

Powiązane problemy