为什么要在 中留出一块内存setvbuf()
?
我不知道您为什么要将读/写流发送到缓冲区。
setvbuf
并非旨在将输出重定向到缓冲区(如果您想在使用sprintf
& co. 的缓冲区上执行 IO),而是严格控制给定流的缓冲行为。
事实上,C IO 函数不会立即将要写入的数据传递给操作系统,而是保留一个中间缓冲区以避免连续执行(可能很昂贵)系统调用,在实际执行写入之前等待缓冲区填满。
最基本的情况是完全禁用缓冲(例如,如果写入日志文件,您希望数据在每次输出操作后立即进入磁盘,则很有用),或者另一方面,在流上启用块缓冲默认禁用(或设置为行缓冲)。这可能有助于提高输出性能。
如果您正在使用已知可以在特定缓冲区大小下正常工作的设备,则为输出设置特定缓冲区可能很有用;另一方面,您可能希望有一个小的缓冲区来减少内存受限环境中的内存使用量,或者避免在断电的情况下丢失大量数据而不完全禁用缓冲。
在使用 eg 打开的 C 文件fopen
中,默认情况下是缓冲的。您可以使用setvbuf
来提供自己的缓冲区,或使文件操作完全无缓冲(就像 to stderr
is)。
它可用于fmemopen
在没有该功能的系统上创建功能。
文件缓冲区的大小会影响标准库调用 I/O 速率。Steven 的“UNIX 环境中的高级编程”的第 5 章中有一张表格,显示 I/O 吞吐量随着 I/O 缓冲区大小的增加而急剧增加,最高可达 ~16K,然后趋于平稳。许多其他因素会影响整体 I/O 吞吐量,因此这种“调整”影响可能是也可能不是万能药。这是“为什么”的主要原因,而不是关闭/打开缓冲。
每个FILE
结构都有一个内部与之关联的缓冲区。这背后的原因是为了减少 I/O,而真正的 I/O 操作是时间成本高的。您的所有读/写都将被缓冲,直到缓冲区已满。所有缓冲的数据都将在一次真正的 I/O 操作中输出/输入。
为什么要在 setvbuf() 中留出一块内存?
用于缓冲。
我不知道您为什么要将读/写流发送到缓冲区。
我也没有,但因为这不是它的作用,所以这一点没有实际意义。
“setvbuf() 函数可用于任何打开的流以更改其缓冲区” [我的重点]。换句话说,它已经有一个缓冲区,而函数所做的就是改变它。它没有说明“将读/写流发送到缓冲区”。我建议您阅读手册页以查看其实际内容。尤其是这部分:
当输出流未缓冲时,信息一写入就出现在目标文件或终端上;当它被块缓冲时,许多字符被保存并作为一个块写入;当它是行缓冲字符时,将保存字符,直到输出换行符或从连接到终端设备(通常是标准输入)的任何流中读取输入。