Знает ли компилятор C, когда оператор работает с файлом и, таким образом, имеет «наблюдаемое поведение»? - PullRequest
0 голосов
/ 21 января 2019

Стандарт C99 5.1.2.3 $ 2 говорит

Доступ к изменчивому объекту, изменение объекта, изменение файла или вызов функции что любые из этих операций являются побочными эффектами, 12) которые являются изменениями в состоянии среда исполнения. Оценка выражения в целом включает в себя как значение расчеты и инициирование побочных эффектов. Вычисление значения для выражения lvalue включает определение личности обозначенного объекта.

Я предполагаю, что во многих случаях компилятор не может встроить и, возможно, исключить функции, выполняющие ввод / вывод, поскольку они живут в другом модуле перевода. А параметры функций, выполняющих ввод / вывод, часто являются указателями, что еще больше мешает оптимизатору.

.

volatile int ready;

int message[100];
void foo (int i) {
   message[i/10] = 42;
   ready = 1;
}

Как компилятор C определяет, работает ли оператор с файлом? В автономной встроенной среде я объявляю регистры как энергозависимые, что не позволяет компилятору оптимизировать вызовы и менять порядок вызовов ввода / вывода.

Это единственный способ сообщить компилятору, что мы делаем ввод / вывод? Или стандарт C диктует, что эти N вызовов в стандартной библиотеке выполняют ввод-вывод и, следовательно, должны получать специальную обработку? Но что, если кто-то создал свою собственную оболочку системных вызовов, скажем, для чтения?

1 Ответ

0 голосов
/ 21 января 2019

Поскольку в C нет операторов, предназначенных для ввода-вывода, только вызовы функций могут изменять файлы.Поэтому, если компилятор не видит вызова функции в последовательности операторов, он знает, что эта последовательность не изменила ни одного файла.

Если вызываются только функции из стандартной библиотеки, и если среда размещена, компилятор может знать, что они делают, и использовать это, чтобы угадать, что произойдет.

Но что действительно важно, так это то, что компилятору нужно только учитывать побочные эффекты.Когда он не знает, вполне допустимо предполагать, что вызов функции может включать побочные эффекты и действовать соответствующим образом.Это не будет нарушением стандарта, если никакие побочные эффекты на самом деле не задействованы, просто возможно потеряет более высокую оптимизацию.

...