为什么printf(C)在后续调用中使用相同的缓冲区?

omtl5h9j  于 2023-04-05  发布在  其他
关注(0)|答案(1)|浏览(102)

我注意到在我的printf for C的实现中,一个1024字节的缓冲区被分配并用于所有后续调用,而不是显式释放(引用的理由是Linux内核将在程序终止时这样做)。
我读过关于缓冲I/O的文章;不过,我不太明白为何要重复使用这个缓冲区,而不是为每次调用分配一个所需大小的缓冲区。我考虑过以下原因:

  • 减少系统调用次数
  • malloc可能需要不确定的时间量或具有可变的结果
  • 所需空间量可能不可用(在我的系统上不太可能)

我不太明白动机。有人能提供一个明确的理由吗?显然这只是猜测,除非为printf编写源代码的人看到这个问题。

mklgxw1f

mklgxw1f1#

我将您的问题广义地解释为“重用内存缓冲区的好处是什么”,而不是在每次使用内存时执行动态内存分配。这样做有两个很好的技术原因:

  • 如果内存分配器实际上需要从系统请求更多内存,那么内存分配可能是昂贵的操作(与纯计算相比)。
  • 重用相同的内存可以提高CPU缓存的性能,因为内存已经被缓存的可能性更大。

如果你想知道printf这样做的具体原因和考虑的具体权衡,我建议给作者发电子邮件。

相关问题