Visual C ++ Volatile - PullRequest
       2

Visual C ++ Volatile

8 голосов
/ 21 сентября 2011

Документы MSDN для «volatile» в Visual C ++ указывают, что записи имеют «семантику выпуска» и что чтения имеют «семантику получения», в дополнение к обеспечению того, что чтение всегда читается из памяти и что запись всегда записывается соответственно.

Спецификация C для «volatile» включает в себя вторую часть (не делайте сумасшедших оптимизаций), но не первую часть (забор памяти).

Есть ли в Visual C ++ какой-либо способ получить изменчивое поведение "C" только без ограничения памяти?

Я хочу, чтобы переменная всегда была в стеке, в фиксированномна месте, но я не хочу брать на себя накладные расходы на ограничение памяти при каждом назначении ему.

Есть ли какой-нибудь простой способ сделать это с источником Visual C ++?

1 Ответ

4 голосов
/ 21 сентября 2011

Есть ли в Visual C ++ какой-либо способ получить изменчивое поведение "C" только без ограничения памяти?

В x86 нет ограничений памяти, созданных на уровне сборки при чтении и записи в область памяти volatile, поскольку на этой платформе каждая загрузка имеет семантику получения, а каждое хранилище имеет семантику выпуска. Поэтому для MSVC на x86 директива volatile просто указывает компилятору предотвращать переупорядочение загрузок и сохранений в зависимости от того, пишете ли вы или читаете из области памяти, помеченной volatile.

Вы бы понесли "штраф" за ограничение памяти в архитектуре IA64, поскольку там модель упорядочения памяти платформы не обеспечивает сбор и освобождение семантики для нагрузок и хранилищ.

Имейте в виду, что это поведение специфично для MSVC и не является стандартизированной семантикой volatile.

Обновление : Согласно @ildjarn, вы также можете увидеть ограничение памяти на ARM с Windows 8, поскольку эта платформа также имеет слабо упорядоченную модель согласованности памяти, такую ​​как IA64.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...