Скажи, у меня есть этот код:
int f() {
volatile int c;
c=34;
return abc();
}
изменчивый int c никогда не читается Но это помечено как летучий, может ли компилятор устранить это вообще? Мое тестирование в Visual C ++ 2010 показывает противоречивые результаты. В VC ++, если я включаю оптимизацию (максимизация скорости), вышеупомянутая функция содержит локальную переменную с именем c (просматривая сгенерированный список сборок). Но вместо использования оператора присваивания я также попытался инициализировать переменную встроенной функцией компилятора, такой как memset () (и разрешить использование встроенных функций компилятора), переменная исключена.
int f() {
volatile int c;
memset((void*)&c,34, 1);
return abc();
}
Таким образом, согласно стандарту C ++, может ли компилятор устранить изменчивый int c? Я думаю, что, вероятно, в VC ++ есть некоторое противоречивое поведение, связанное с тем, как встроенные функции оптимизируют переменную переменную.
Таким образом, в соответствии со стандартом C ++, может ли компилятор устранить изменчивый int c?
нет. volatile
квалифицированные объекты используются для чтения или записи на аппаратном уровне, а также побочные эффекты назначения volatile
объект наблюдаемый.
Следовательно, в соответствии с ограничениями на оптимизацию, наложенными так называемыми правило «как будто», соответствующие реализации не позволяют оптимизировать c
, «как будто«правило официально введено в параграф 1.9 / 1 стандарта C ++ 11:
Семантические описания в этом международном стандарте определяют параметризованный недетерминированный реферат
машина. Настоящий международный стандарт не предъявляет требований к структуре соответствующих реализаций.
В частности, им не нужно копировать или эмулировать структуру абстрактной машины. Скорее, соответствует
реализации должны эмулировать (только) наблюдаемое поведение абстрактной машины, как объяснено
ниже
И понятие «наблюдаемое поведение«определено в пункте 1.9 / 8:
Минимальные требования к соответствующей реализации:
— Доступ к изменчивым объектам оценивается строго по правилам абстрактной машины..
— При завершении программы все данные, записанные в файлы, должны быть идентичны одному из возможных результатов, которые
Выполнение программы в соответствии с абстрактной семантикой было бы произведено.— Динамика ввода и вывода интерактивных устройств должна происходить таким образом, чтобы
вывод на самом деле доставляется до того, как программа ожидает ввода. Что представляет собой интерактивное устройство
определяется реализацией.Все вместе называются наблюдаемое поведение программы. […]
Так как доступ к volatile
объекты должны оцениваться строго по правилам абстрактной машины, компиляторам запрещается оптимизировать c
и соответствующая операция присваивания.
memset((void*)&c,34, 1);
имеет неопределенное поведение (§7.1.6.1 / 6). Поэтому компилятору разрешено выдавать любой результат.
Если предпринята попытка обратиться к объекту, определенному с типом, определенным с помощью volatile, посредством использования glvalue с типом, не определенным с помощью volatile, поведение программы не определено.
Пожалуйста, не используйте такие приведения, тем более C-стиль. Когда кто-то не знает, что такое правильное приведение C ++ для определенной ситуации, это, вероятно, ситуация, когда не нужно ничего приводить.