Некоторые компиляторы рассматривают доступ к объектам с изменчивой квалификацией как ограничение памяти. Другие нет. Некоторые программы написаны так, чтобы требовать, чтобы volatile
работал как забор. Другие нет.
Код, который написан для использования заборов, работающих на платформах, которые их предоставляют, может работать лучше, чем код, который написан так, чтобы не требовать заборов, работающих на платформах, которые их не предоставляют, но код, для которого требуются заборы, будет работать неправильно, если они не предоставляются Код, который не требует заборов, часто будет работать медленнее на платформах, которые их предоставляют, чем код, который требует заборов, и реализации, которые предоставляют заборы, будут запускать такой код медленнее, чем те, которые этого не делают.
Хорошим подходом может быть определение макроса semi_volatile
как расширения до нуля в системах, где volatile
подразумевает ограничение памяти, или volatile
в системах, где он не используется. Если переменные, которые должны иметь доступ, упорядоченный по отношению к другим volatile
переменным, но не по отношению друг к другу, квалифицируются как semi-volatile
, и этот макрос определен правильно, надежная работа будет достигнута в системах с или без ограждений памяти, и будет достигнута наиболее эффективная работа, которая может быть достигнута в системах с заборами. Если компилятор фактически реализует квалификатор, который работает как требуется, semivolatile
, он может быть определен как макрос, который использует этот классификатор и обеспечивает еще лучший код.
ИМХО, это область, которой действительно должен уделить внимание Стандарт, поскольку соответствующие концепции применимы ко многим платформам, и любая платформа, где ограждения не имеют смысла, может просто их игнорировать.