【发布时间】:2021-12-11 21:54:54
【问题描述】:
我正在 Linux 上用 C 语言编写一个程序,其中各种内容将通过printf 写入stdout。自然,我会尽量减少 IO 调用并缓冲所有信息,然后将其传递给单个打印调用。但是,通过测试,我发现printf 会自行缓冲,直到达到'\n'。
我的问题是,我可以确定所有 printf 实现都这样做,还是 glibc 刚刚优化?信任printf为我做缓冲可靠吗?
【问题讨论】:
-
@EugeneSh。谢谢。
-
虽然不具有权威性,但措辞on cppreference 有点暗示它部分是。
stdin和stdout必须完全缓冲,除非连接到交互式设备。stderr永远不会完全缓冲。 -
@Someprogrammerdude 实际上它是由标准规定的,所以我收回我的第一条评论:port70.net/~nsz/c/c11/n1570.html#7.21.3p7
-
我会说假设
printf被缓冲是安全的。我想说,任何将字符捆绑在自己的显式缓冲区中的尝试,以人为地最小化实际printf调用的数量,这将是一种巨大且不必要的时间浪费。 (对于没有实际缓冲的嵌入式平台,可能有带有微型 C 库的编译器。你是在为这样的环境编程吗?你说的是 Linux,所以我猜不是。) -
@SteveSummit 有无缓冲的微控制器实现。但是在这种适用的低端系统上,无论如何使用
stdio.h被认为是非常糟糕的做法,因为像 printf 这样的函数会扼杀所有可用的内存和执行速度。