C++ CRT存储器分配

C++ CRT存储器分配,c++,memory-management,crt,defragmentation,contiguous,C++,Memory Management,Crt,Defragmentation,Contiguous,我们的应用程序分配几何坐标的大std::vector- 它必须是一个向量(表示连续),因为它最终被发送到OpenGL来绘制模型。 OpenGL可以处理连续数据。 有时分配失败,这意味着保留内存会引发std::bad_alloc异常。 然而,此时仍有大量内存可用。 问题是,连续块无法分配。 所以前两个问题是: 有没有办法控制CRT分配内存的方式?或者是一种整理碎片的方法(疯狂的想法)) 也许有一种方法可以检查运行时是否可以分配一定大小的内存块(不使用try/catch) 通过将一个大向量分解为

我们的应用程序分配几何坐标的大std::vector-
它必须是一个向量(表示连续),因为它最终被发送到OpenGL来绘制模型。
OpenGL可以处理连续数据。
有时分配失败,这意味着保留内存会引发std::bad_alloc异常。 然而,此时仍有大量内存可用。
问题是,连续块无法分配。
所以前两个问题是:

  • 有没有办法控制CRT分配内存的方式?或者是一种整理碎片的方法(疯狂的想法))

  • 也许有一种方法可以检查运行时是否可以分配一定大小的内存块(不使用try/catch)

通过将一个大向量分解为多个向量,并为每个向量调用一次OpenGL,上述问题得到了部分解决。

然而,仍然存在一个问题,即如何定义每个较小向量的大小——如果有很多向量的大小相当小,我们几乎可以确定它们适合内存,但会有大量调用OpenGL,这将减慢可视化速度

如果堆碎片真的是你的问题,并且你在Windows上运行,那么你可能想研究一下低碎片堆选项,在32位地址空间中,你不能超过~600MB的连续内存。编译为64位,并在64位平台上运行,以解决这个问题(希望永远如此)

这就是说,如果您有如此苛刻的内存需求,您应该研究定制的分配器。您可以使用磁盘备份的分配,该分配在向量中显示为基于内存的存储。您可以为OpenGL映射文件。

查看此链接:并且,如Cat Plus所述,确保您拥有64位CPU和操作系统:)