根据C++03标准的可观察行为(1.9/6),包括调用库I/O函数。现在我有以下代码:
printf( "" );
这实际上是对库I/O函数的调用,但没有任何效果。
这是可观察的行为吗?编译器是否被允许消除它?
根据C++03标准的可观察行为(1.9/6),包括调用库I/O函数。现在我有以下代码:
printf( "" );
这实际上是对库I/O函数的调用,但没有任何效果。
这是可观察的行为吗?编译器是否被允许消除它?
如果 sync_with_stdio
为 true
,那么这是可以观察到的。当它为真时,printf("")
强制与 std::cout
输出同步,并刷新先前缓冲的输出。
sync_with_stdio
可能会改变 stdio 的表现,而不仅仅是改变 C++ 流的工作方式,这可能会导致前者发生奇怪的事情吗? - Deduplicator如果输出被重定向并且文件已关闭、被截断或以某种方式变得无效,则会观察到这一点。
关于sync_with_...的观点也非常相关。
我非常怀疑,因为如果操作系统在调用printf
时阻塞I/O时选择进行上下文切换,那么这种行为可能会在多线程编程中变得更加明显。
在这种情况下,如果结果取决于线程的交错方式,则肯定会产生影响。
理论上,你可以编写一个 C 库来根据时间刷新缓冲区。在这种情况下,打印空字符串可以导致刷新,从而产生可见效果。
当然,这会有可观察的行为 - 它必须生成一个调用write()系统调用的底层文件描述符。进行系统调用是非常可观察的行为。
考虑一个极端的例子,内核中的文件描述符可能由设备驱动程序提供服务,每次调用写文件操作时都会发出警报声(好吧,有点人为的例子,我承认 :-) ...
write
调用存在。如果操作系统只有一个 PUTCHAR(C)
调用,那么 printf
实现将不得不循环。显然,对于 ""
的循环将完全不调用 PUTCHAR
,也就是说不可观察到。 - MSalters