在c++中打印一个空字符串的可观察行为
Is printing an empty string observable behavior in C++?
在c++ 03中,标准的可观察行为(1.9/6)包括调用库I/O函数。现在我有了这样的代码:
printf( "" );
,形式上是对库I/O函数的调用,但没有效果。
它是可观察的行为吗?编译器允许消除它吗?
如果sync_with_stdio
是true
,这当然是可以观察到的。当此为真时,printf("")
强制与std::cout
输出同步,刷新先前缓冲的输出。
它是可观察的
- 如果输出被重定向并且文件被关闭、截断或以某种方式已成为输出无效
- 如果流状态为"坏"
关于sync_with_…也是非常相关的
我非常怀疑,因为在多线程编程中,如果操作系统在调用printf
的线程阻塞I/o时选择上下文切换,那么这种行为可能会变得更加明显。
在这种情况下,如果结果取决于线程的交错方式,那么它肯定会产生影响。
理论上,您可以以一种基于时间刷新缓冲区的方式编写C库。在这种情况下,打印空字符串可以导致刷新,从而产生可见的效果。
当然,这具有可观察的行为-它必须生成一个调用write()系统调用与底层文件描述符。进行系统调用是非常可观察的行为。
考虑一个极端的例子,内核中的文件描述符可能由设备驱动程序提供服务,每次调用它的写文件操作时都会发出警报(好吧,我承认有点人为的例子:-)…