11

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

printf( "" );

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

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

4

5 回答 5

5

如果sync_with_stdiois肯定是可以观察到的true。如果是这样,则printf("")强制与输出同步std::cout,刷新先前缓冲的输出。

于 2011-08-26T15:18:33.760 回答
2

可以观察到

  • 如果输出被重定向并且文件被关闭、截断或以某种方式对输出无效
  • 如果流状态无论如何都是“坏的”

关于 sync_with_... 的观点也非常相关

于 2011-08-26T15:23:59.487 回答
1

printf我对此表示高度怀疑,因为如果操作系统在线程调用阻塞 I/O时选择上下文切换,则该行为在多线程编程中可能会变得更加明显。

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

于 2011-08-26T14:38:19.650 回答
1

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

于 2011-08-26T15:22:25.950 回答
-3

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

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

于 2011-08-26T14:44:58.623 回答