如何在C++中管理大型缓冲区?

4

如果我需要在我的C++程序中使用一个大的缓存,哪种方法更好?

  1. 在堆上分配缓冲区,并在使用它的类中保留对该缓冲区的引用。

  2. 分配一个静态缓冲区,并使其成为全局变量。


2
你的应用程序是多线程还是单线程? - anon
5个回答

14

如何实现:3. 使用向量(vector)。

[编辑补充:如果您满意于此依赖项,则boost::array是一个不错的选择]


那真的没有回答问题 - 它基本上只是建议 1),因为向量只是一个包装形式的堆分配。 - Reed Copsey
2
@Reed:是的,它的意思是- 使用堆内存但避免手动管理。 - EFraim
Reed: 我认为这个回答让 OP 重新思考缓冲管理的全部问题,给个赞。 - Indy9000
1
当然,它直接回答了标题中的问题,并隐含地支持(1)而非(2)。但是我不想说“执行1”,以免被误解为“调用new并将结果指针存储在任何地方”。 - Steve Jessop

2

使用静态缓冲区的缺点是你无法确定它何时被删除,如果你想在某个对象销毁期间使用该缓冲区,它可能已经不存在了。因此,为了更好地控制,我会选择选项1。


2

我更喜欢堆分配,有很多原因:

我偏爱堆分配的主要原因是它可以在运行时验证分配是否成功。当您尝试分配内存时,如果由于任何原因失败,将显而易见,并且您可以比使用静态缓冲区更优雅地处理它。

它还允许您分配各种大小的缓冲区,并在以后重新分配/释放(如果可能)。


1
你的程序是做什么的?如果缓冲区与应用程序一样长,并且在编译时知道其大小,则可以使用静态缓冲区。
此外,如已经提到的,考虑使用向量(除非您有基准测试表明性能太差),以防止缓冲区溢出。

1

在处理大量内存时,你需要考虑两件事情:生命周期和创建和重新创建此缓冲区的频率。随着内存碎片化,可能会出现这样一种情况:尝试分配512MB缓冲区,由于分配器无法找到512MB的连续地址空间,因此无法分配。这就是为什么@onebyone使用向量的想法有时更好。如果您可以将占用空间减少到字节大小(不是真的),则可以在管理内存时获得灵活性。

话虽如此,我几乎从不建议保留大型静态缓冲区。那是在找麻烦。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接