Печатает пустую строку наблюдаемого поведения в С++?

В С++ 03 Стандартное наблюдаемое поведение (1.9/6) включает вызовы функций библиотечного ввода-вывода. Теперь у меня есть этот код:

printf( "" );

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

Является ли это наблюдаемым поведением? Предотвращает ли компилятор его устранение?

Ответ 1

Это, безусловно, наблюдаемо, если sync_with_stdio true. Когда это верно, printf("") принудительно синхронизирует с выводом std::cout, промывая ранее буферизованный вывод.

Ответ 2

Это наблюдалось бы

  • если вывод перенаправлен, и файл был закрыт, усечен или каким-то образом стал недействительным для вывода
  • Если состояние потока было "плохо" в любом случае

Точка, сделанная о sync_with _..., также очень актуальна

Ответ 3

Я очень сомневаюсь в этом, так как поведение может стать более заметным при многопоточном программировании, если ОС выбирает контекстный переключатель, когда поток вызывает printf блоки для ввода-вывода.

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

Ответ 4

Теоретически, вы можете писать C-библиотеку таким образом, чтобы сбрасывать буфер по времени. В этом случае печать пустой строки может привести к флешу, создавая видимый эффект.

Ответ 5

Конечно, это имеет наблюдаемое поведение - он должен генерировать вызов write() системного вызова с базовым файловым дескриптором. Выполнение системного вызова - очень наблюдаемое поведение.

Рассмотрим в качестве крайнего примера, что файловый дескриптор в ядре может обслуживаться драйвером устройства, который звучит сиреном каждый раз при записи операции с файлом (в порядке, в некотором смысле, искусственном примере, я соглашусь:-)...