在c++中打印一个空字符串的可观察行为

Is printing an empty string observable behavior in C++?

本文关键字:字符串 观察 一个 c++ 打印      更新时间:2023-10-16

在c++ 03中,标准的可观察行为(1.9/6)包括调用库I/O函数。现在我有了这样的代码:

printf( "" );

,形式上是对库I/O函数的调用,但没有效果。

它是可观察的行为吗?编译器允许消除它吗?

如果sync_with_stdiotrue,这当然是可以观察到的。当此为真时,printf("")强制与std::cout输出同步,刷新先前缓冲的输出。

它是可观察的

  • 如果输出被重定向并且文件被关闭、截断或以某种方式已成为输出无效
  • 如果流状态为"坏"

关于sync_with_…也是非常相关的

我非常怀疑,因为在多线程编程中,如果操作系统在调用printf的线程阻塞I/o时选择上下文切换,那么这种行为可能会变得更加明显。

在这种情况下,如果结果取决于线程的交错方式,那么它肯定会产生影响。

理论上,您可以以一种基于时间刷新缓冲区的方式编写C库。在这种情况下,打印空字符串可以导致刷新,从而产生可见的效果。

当然,这具有可观察的行为-它必须生成一个调用write()系统调用与底层文件描述符。进行系统调用是非常可观察的行为。

考虑一个极端的例子,内核中的文件描述符可能由设备驱动程序提供服务,每次调用它的写文件操作时都会发出警报(好吧,我承认有点人为的例子:-)…