我有后台进程(unix系统上的守护进程),在某些地方对源文件进行std::cout
调试。我在静音模式或NO静音模式下运行这个守护进程。在进程启动后的silence mode
上,我执行这段代码:
std::cout.rdbuf(0);
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
正如你所理解的,std::cout
仍然存在于代码中并运行。
在NON silence mode
上有很大的开销,而cout
到屏幕是非常昂贵和缓慢的IO操作。
: silence mode
上的代码开销是多少?由于std::cout
存在,但STDOUT_FILENO
关闭,我的程序是否有一些"拖拽"?(有时它会尝试打印多达1kb的信息)
这个开销有多大?
显然有一些开销。但不多;每个<<
的第一件事是测试流状态是否良好。如果相应的物理设备处于关闭状态,则不应该是。至少,它会在第一次刷新后出现问题(由于缓冲区已满)。或者,您可以调用std::cout.rdbuf( nullptr )
,这应该会使它立即变坏。
传统的解决方案是创建一个无操作流。这样做的好处是流不会出错:读取总是看到文件结束,输出总是工作。它的缺点是,由于流状态良好,您实际上格式化了所有输出:std::cout << someDouble
将完成将双精度数转换为字符序列的所有工作。如果流状态不好(就像nullptr
作为流缓冲区时一样),<<
操作符在尝试转换任何内容之前返回。