Стандарт 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 вызовов в стандартной библиотеке выполняют ввод-вывод и, следовательно, должны получать специальную обработку? Но что, если кто-то создал свою собственную оболочку системных вызовов, скажем, для чтения?