Стандарт разработан для поддержки на платформах со странной и причудливой семантикой памяти. Слишком приспособившись к этому, вы избегаете навязывания каких-либо требований к тому, как реализации обрабатывают любые конструкции, которые могут быть трудно предсказуемыми для некоторых платформ. В некоторых реализациях это воспринимается как лицензия на произвольное и непредсказуемое поведение в таких случаях даже при нацеливании на платформы, которые естественным образом поддерживают более сильную семантику памяти . Это облегчает некоторые виды оптимизации, но может потребовать от программистов принятия явных действий в руки оптимизаторов, в некоторых случаях делающих вещи менее эффективными, чем они могли бы быть, если бы компиляторы обеспечивали (и программисты использовали) более сильную семантику, чем Стандарт требует.
В качестве примера ситуации, когда вещи могут go ошибаться, рассмотрим что-то вроде:
extern int foo;
int x=foo;
.... some code that modifies neither x nor foo
int y=x;
.... some code that modifies neither y nor foo (but might modify x)
doSomething(x, y);
Было бы вполне правдоподобно, что оптимизирующий компилятор мог бы заменить последний вызов функции с doSomething(x, foo)
при условии, что foo
должно равняться значению, которое y
имел бы во время первоначального присваивания. Вместо того, чтобы использовать модель абстракции, которая допускала бы ограниченный недетерминизм, авторы Стандарта просто отказались предоставить какие-либо поведенческие гарантии в отношении последствий неожиданного изменения значений объектов.