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