Позволяет ли C ++ 11 (не требуется) выпускать / получать семантику для ключевого слова volatile

Начиная с Visual C ++ 2005, Microsoft сделала дополнительные гарантии заказа для доступа к volatile типы, которые не требуются стандартом C ++.

Что-нибудь в стандарте C ++ на самом деле запрещает эти гарантии? Документация Microsoft кажется так думает.

Пожалуйста, дайте мне знать, разрешает ли стандарт упорядочение, реализованное Microsoft, а также проголосуйте за этот отчет об ошибке:

14

Решение

Реализация, безусловно, позволяет делать что-то сверх того, что требуется, при условии, что она соответствует требованиям, установленным стандартом. Добавление семантики выпуска / приобретения к volatile Объект определенно находится в пределах видимости. Я не думаю, что в комитете C ++ есть интерес к изменению семантики (мы только начинаем новую неделю обсуждения C ++ в Портленде с Хербом, который сейчас обсуждает, как организовать встречу).

9

Другие решения

Стандарт требует, чтобы доступ к изменчивым объектам оценивается строго по правилам абстрактной машины, что примерно означает «не оптимизировать», но не более того. Например, компилятору не разрешено кэшировать значение в регистре или выполнять обычное исключение подвыражения. Он должен делать именно то, что вы говорите.

Таким образом, для всех стандартных забот, volatile имеет memory_order_relaxed семантика (она не определяет ничего другого). Это, конечно, не означает, что вам не разрешено внедрять что-то более строгое.

Компилятор Microsoft всегда (с 2005 года как отмечает Бен Фойгт) volatile как приобретение / выпуск, что приводит к тому, что многие люди принимают «volatile == threadsafe», что, в свою очередь, привело к тому, что многие статьи превратили это в «volatile бесполезно!» и «изменчиво зло».

Вероятная причина, по которой MS рекомендует использовать реализацию ISO, состоит в том, что это заставляет их компилятор вести себя как любой другой компилятор, больше никаких неприятных сюрпризов.

0

По вопросам рекламы [email protected]