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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C和/或C ++中创建和管理内存中的字节缓冲区,可以根据需要自动调整大小相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

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

答案

只要您确保文件不会在步骤3和5之间改变大小,您的方法没有任何问题。实际上,这个解决方案最有可能是最佳性能。

如果你知道(通过计算字节读取与缓冲区大小),而reading文件有更多要读取但你用完了缓冲区空间,你总是可以使用realloc增加缓冲区任意数量。 “任意数量”将取决于应用程序的性质和预期的内存情况。如果内存充足,您可能希望在读完整个文件后,将因子1.5和realloc过度分配到实际大小。

然而,动态地重新分配缓冲区会有一点速度损失,当您使用大缓冲区并且内存已经紧张时,可能并不总是可行(大多数realloc实现将暂时需要保持太小)以及内存中重新调整大小的缓冲区。

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

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

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

以上是关于在C和/或C ++中创建和管理内存中的字节缓冲区,可以根据需要自动调整大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 或 C 中创建和编写索引 png 图像

Objective C 中的部分屏幕截图

C++变量和常量

四月十号java知识点

Python中的指针:有什么意义?

在 R 中创建和组合两个图 - xy 线图和条形链图