gpt4 book ai didi

C:就缓冲而言,输出例程的效率如何?

转载 作者:太空宇宙 更新时间:2023-11-04 05:40:46 24 4
gpt4 key购买 nike

当使用 fprintffwrite 写入文件时,我找不到任何关于缓冲是否已经隐式完成的信息。我知道这可能是实现/平台相关的功能。我感兴趣的是,我是否至少可以期望它在 Windows、Linux 或 Mac OS X 等现代流行平台上有效实现?

据我所知,通常 I/O 例程的缓冲是在 2 个级别上完成的:

  1. 库级别:可以是C标准库,也可以是Java SDK(BufferedOutputStream)等;
  2. 操作系统级别:现代平台广泛缓存/缓冲 I/O 操作。

我的问题是关于#1,而不是#2(我知道这已经是真的)。换句话说,我可以期望所有现代平台的 C 标准库实现都利用缓冲吗?

如果不是,那么手动创建一个缓冲区(巧妙地选择大小)并在溢出时刷新它是解决问题的好方法吗?

结论


感谢所有指出setbufsetvbuf 函数的人。这些是我一直在寻找的确切证据来回答我的问题。有用的摘录:

All files are opened with a default allocated buffer (fully buffered) if they are known to not refer to an interactive device. This function can be used to either set a specific memory block to be used as buffer or to disable buffering for the stream.

The default streams stdin and stdout are fully buffered by default if they are known to not refer to an interactive device. Otherwise, they may either be line buffered or unbuffered by default, depending on the system and library implementation. The same is true for stderr, which is always either line buffered or unbuffered by default.

最佳答案

在大多数情况下,stdio 例程的缓冲被调整为与相关操作系统的典型 block 大小一致。这样做是为了优化默认情况下的 I/O 操作数。当然,您始终可以使用 setbuf()/setvbuf() 例程更改它。

除非您正在做一些特殊的事情,否则您应该坚持使用默认缓冲,因为您可以非常确定它在您的操作系统上最优化(对于典型场景)。

唯一可以证明它的情况是当你想使用 stdio 库与不适合它的 I/O channel 交互时,在这种情况下你可能想完全禁用缓冲。但我不会经常看到这种情况。

关于C:就缓冲而言,输出例程的效率如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19716591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com