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

问题描述 投票:2回答:1

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

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

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

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

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

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

c++ c memory-management data-structures file-io
1个回答
2
投票

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.