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