在内存(C 和/或 C++)中创建和管理字节缓冲区,该缓冲区可以根据需要自动调整大小



当用C和/或C++编程时,如何设置内存中的字节缓冲区结构,以便它可以根据情况自动调整大小?

通常,我会想要将一些未知数量的字节写入缓冲区,而不知道需要多少空间。我觉得这是一个基本的 I/O 编程问题——我不知道如何处理这个问题,更不用说解决了它了。

具体来说,我正在执行此I/O来处理图像数据 - 大小可以从几千字节到数百兆字节不等,具体取决于压缩设置和(许多!)其他因素。

在许多情况下,我目前的解决方法是:

  1. 在临时文件上open()写入模式描述符,并将我不确定的字节数write()到该文件;
  2. 然后调用fsync()并随后close()描述符;
  3. 使用stat()获取文件的大小;
  4. 在读取模式下重新open()临时文件;
  5. 最后将整个文件read()回新分配的适当大小的缓冲区中。

因此,我的问题是两部分:一,我的解决方法有多大问题?二:如何仅使用内存中结构完成此任务?

只要您可以确保文件在步骤 3 和 5 之间不会更改大小,您的方法就没有错。实际上,它是最有可能具有最佳性能的解决方案。

如果您在read文件时意识到(通过计算读取的字节数与缓冲区大小)还有更多要读取但缓冲区空间不足,则始终可以使用realloc将缓冲区增加任意量。该"任意数量"是多少取决于应用程序的性质和预期的内存情况。如果内存充足,则可能需要按因子 1.5 进行过度分配,并在读取完整文件后realloc到实际大小。

但是,动态重新分配缓冲区会降低速度,并且当您使用巨大的缓冲区并且内存已经很紧张时,可能并不总是可行的(大多数realloc实现暂时需要在内存中同时保存太小和重新调整大小的缓冲区)。

根据缓冲区大小,程序在调整缓冲区大小时也可能受到性能损失 - 毕竟,需要将已读取的内容复制到新的、重新调整大小的缓冲区。

在C++中,您可能会使用vector来做同样的事情,并且可能会遇到相同的问题。

加载大文件的最后一种方法是内存映射 - 但这也需要知道需要多少空间。

最新更新