在C和/或C ++中创建和管理内存中的字节缓冲区,可以根据需要自动调整大小
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C和/或C ++中创建和管理内存中的字节缓冲区,可以根据需要自动调整大小相关的知识,希望对你有一定的参考价值。
在C和/或C ++中编程时,如何设置字节缓冲区内存结构,以便根据情况需要自动调整大小?
通常,我会想要将一些未知数量的字节写入缓冲区,而不知道需要多少空间。我觉得这是一个基本的I / O编程问题 - 我不知道如何解决问题,更不用说解决它了。
具体来说,我正在做这个I / O来处理图像数据 - 大小可以从几千字节到几百兆不等,具体取决于压缩设置和(很多!)其他因素。
在许多情况下,我目前的解决方法是:
open()
是临时文件上的写模式描述符,write()
是我对此文件的不确定字节数;- 然后调用
fsync()
,然后调用close()
描述符; - 使用
stat()
来获取文件的大小; - re-
open()
读取模式下的临时文件; - 然后最后
read()
整个文件回到一个新分配的,适当大小的缓冲区。
因此,我的问题是两个部分:一,我的解决方法有多大问题?二:如何只使用内存结构来完成这项任务?
只要您确保文件不会在步骤3和5之间改变大小,您的方法没有任何问题。实际上,这个解决方案最有可能是最佳性能。
如果你知道(通过计算字节读取与缓冲区大小),而read
ing文件有更多要读取但你用完了缓冲区空间,你总是可以使用realloc
增加缓冲区任意数量。 “任意数量”将取决于应用程序的性质和预期的内存情况。如果内存充足,您可能希望在读完整个文件后,将因子1.5和realloc
过度分配到实际大小。
然而,动态地重新分配缓冲区会有一点速度损失,当您使用大缓冲区并且内存已经紧张时,可能并不总是可行(大多数realloc
实现将暂时需要保持太小)以及内存中重新调整大小的缓冲区。
根据缓冲区大小,在调整缓冲区大小时,程序可能还会受到性能损失 - 毕竟,您已读取的内容需要复制到新的,重新调整大小的缓冲区。
在C ++中,你可能会使用vector
做同样的事情,并可能遇到同样的问题。
加载大型文件的最后一种方法是内存映射 - 但这也要求您需要知道需要多少空间。
以上是关于在C和/或C ++中创建和管理内存中的字节缓冲区,可以根据需要自动调整大小的主要内容,如果未能解决你的问题,请参考以下文章