У меня есть фоновый процесс (демон в системе Unix), которые имеют std::cout
для отладки исходного файла в некоторых местах. Я запускаю этого демона в режиме тишины или в режиме без тишины. На silence mode
после запуска процесса я выполняю этот бит кода:
std::cout.rdbuf(0);
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
И как вы понимаете std::cout
все еще присутствует в коде и работает.
На NON silence mode
есть большие накладные расходы, в то время как cout
на экран очень дорогой и медленный ввод-вывод.
Вопрос:
Какие накладные расходы на код silence mode
? Есть ли некоторые «перетаскивание» для моей программы из-за std::cout
настоящее время, но с закрытыми STDOUT_FILENO
? (время от времени пытайтесь напечатать до 1 килобайта информации)
а насколько велики эти накладные расходы?
Это очевидно имеет некоторые накладные расходы. Но не много; первое в каждом <<
это проверить, что состояние потока хорошее. И это не должен быть, если соответствующее физическое устройство закрыто. По крайней мере, он испортится после первой очистки (из-за переполнения буфера). Или вы можете позвонить std::cout.rdbuf( nullptr )
, который должен сделать это немедленно испортится.
Традиционным решением было создание потокового буфера без операции. Преимущество в том, что поток не идет плохо: чтение просто всегда видит конец файла, а вывод всегда работает. Недостатком является то, что из-за хорошего состояния потока вы фактически форматируете весь вывод: std::cout << someDouble
сделает всю работу по преобразованию двойника в последовательность символов. Если состояние потока плохое (как это будет с nullptr
в качестве буфера потока), то <<
операторы возвращаются, прежде чем пытаться что-либо преобразовать.