После прочтения этого обсуждения я понял, что почти полностью не понимаю:)
Поскольку описание абстрактной машины С++ недостаточно строго (сравнивая, например, с спецификацией JVM), и если точный ответ невозможен, я предпочел бы получить неофициальные разъяснения о правилах, которые были бы разумными "хорошими" ( не вредоносная).
Ключевая концепция части 1.9 свободы реализации Стандартной адресации называется так: если правило:
реализация может свободно игнорировать любые требования этого Стандарт до тех пор, пока результат будет таким, как если бы это требование было подчиняться, насколько это можно определить из наблюдаемого поведения программы.
Термин "наблюдаемое поведение", согласно стандарту (I cite n3092), означает следующее:
- Доступ к неустойчивым объектам оценивается строго в соответствии с правила абстрактной машины.
- При завершении программы все данные, записанные в файлы, должны быть идентичный одному из возможных результатов выполнения программы в соответствии с абстрактной семантикой.
- Динамика ввода и вывода интерактивных устройств место таким образом, что на самом деле запрос на вывод перед тем, как программа ждет ввода. Что представляет собой интерактивный устройство определено реализацией.
Итак, грубо говоря, порядок и операнды операций волатильного доступа и операций io должны быть сохранены; реализация может вносить произвольные изменения в программу, которые сохраняют эти инварианты (по сравнению с некоторым допустимым поведением абстрактной машины С++)
-
Можно ли ожидать, что не-вредоносная реализация значительно расширит операции io (например, любой системный вызов из кода пользователя рассматривается как таковая операция)? (Например, блокировка/разблокировка мьютекса RAII не будет выбрасываться компилятором, если оболочка RAII не содержит летучих).
-
Насколько глубоко "поведенческое наблюдение" должно опускаться с пользовательского уровня на уровне С++ в библиотечные/системные вызовы? Вопрос заключается, конечно, только в вызовах библиотеки, которые не предназначены для io/volatile доступа с точки зрения пользователя (например, в качестве новых операций/удаления), но могут (и обычно) получать доступ к летучим или io в реализации библиотеки/системы. Должен ли компилятор обрабатывать такие вызовы с точки зрения пользователя (и рассматривать такие побочные эффекты как не наблюдаемые) или с точки зрения "библиотеки" (и рассматривать побочные эффекты как наблюдаемые)?
-
Если мне нужно предотвратить компилятор из-за исключения кода, рекомендуется ли не задавать все вышеперечисленные вопросы и просто добавлять (возможно, поддельные) операции с изменчивым доступом (обернуть действия, необходимые для волатильных методов и вызвать их на летучих экземплярах моих собственных классов) в любом случае, что кажется подозрительным?
-
Или я совершенно не прав, и компилятор запрещен для удаления любого кода на С++, за исключением случаев, явно упомянутых стандартом (как удаление копии)