Предположим, у меня есть следующее объявление:
int* volatile x;
Я считаю, что это определяет "нормальную" переменную изменчивого указателя.
Для меня это может означать одно из двух:
Первое предположение
Указатель может измениться, но число не изменится без уведомления. Это означает, что какой-то другой поток (о котором компилятор не знает) может изменить указатель, но если старый указатель указывал на «12», то новый указатель (новое значение указателя, потому что поток изменяет его ) указывало бы на другое «12».
Мне это кажется довольно бесполезным, и я предполагаю, что это не то, чем является настоящая операция.
Вторая догадка
Указатель может измениться, и, таким образом, если указатель изменится, компилятор должен перезагрузить значение в указателе перед его использованием. Но если он подтвердит, что указатель не изменился (с дополнительной проверкой), он может предположить, что значение, на которое он указывает, также осталось прежним.
Итак, мой вопрос заключается в следующем:
Что на самом деле делает объявление энергозависимого указателя на энергонезависимые данные?
volatile
не имеет ничего общего с потоками. - person David Schwartz   schedule 05.08.2016volatile
просто означает его наблюдаемое поведение для чтения и записи этого значения. Таким образом, любое упоминаниеx
означает, что вы должны прочитать значениеx
и не можете предполагать, что знаете его/вы должны записать значениеx
, и не можете предполагать, что это бессмысленно. - person GManNickG   schedule 05.08.2016volatile
имеет какое-то отношение к знаниям компилятора о потоках. - person David Schwartz   schedule 05.08.2016volatile
не имеет ничего общего с потоками. - person David Schwartz   schedule 05.08.2016volatile
никогда нельзя использовать с потоками? На любой существующей архитектуре? - person curiousguy   schedule 19.07.2018volatile
полезен с потоками, - это когда соответствующий язык, потоки или документация компилятора говорят, что у них есть определенная семантика. В противном случае вы просто предполагаете, что он будет продолжать делать то, что вы хотите, потому что он делал то, что вы хотите, когда вы пытались это сделать. Все разумные стандарты многопоточности обеспечивают гарантированные способы получения любой семантики, которая вам нужна, и вы должны использовать их, потому что они гарантированы. - person David Schwartz   schedule 19.07.2018volatile
может иметь некоторую специфичную для платформы семантику, которая может оказаться полезной на некоторых платформах. Слишком много раз я видел ужасный сбой кода, потому что были сделаны предположения о том, что будущие компиляторы или процессоры смогут оптимизировать. Мы должны принять решение перестать совершать эту ошибку рано или поздно. Я не приму твоего приглашения совершить эту ошибку. - person David Schwartz   schedule 18.10.2018volatile std::sig_atomic_t
), требует минимальной производительности. Разве разумные компиляторы для этой платформы не будут реализовывать только то, что на самом деле требует стандарт? (И наихудший сценарий, который можно вообразить, был бы, если у авторов компиляторов не было бы другого выбора, кроме как снизить производительность, потому что люди слушали ваш совет и мудро полагались на поведение, не гарантированное стандартом.) - person David Schwartz   schedule 18.10.2018