大向量和内存守恒c++
Large vectors and memory conservation c++
我正在用C++制作一个平铺映射编辑器。现在,当地图正在编辑时,其属性存储在三个向量中:
vector<vector<vector<bool>>> CanvasCollisionObstruction; //[collision,obstruction][map x][map y]
vector<vector<vector<bool>>> CanvasZoneOverlays; //zone overlays for programmable map zones [zone type][map x][map y]
vector<vector<vector<canvasClip>>> CanvasClips; //identifies which sprite occupies this tile [layer number][map x][map y]
在上述向量中,第2和第3维度([map x]和[map y](是指地图上的实际瓦片坐标。这些只是二维平面图。最后一个矢量的类型是以下结构:
struct canvasClip
{
int tileset;
int clip;
//initialization to check if it's in-use
canvasClip() : tileset(-1), clip(-1) {}
bool isInitialized()
{//a clip is only rendered if it is initialized
return ((tileset >= 0) && (clip >= 0));
}
bool operator==(const canvasClip& a) const
{//used in flood-fill to compare with target tile
return ((tileset == a.tileset) && (clip == a.clip));
}
bool operator!=(const canvasClip& a) const
{//used in flood-fill to compare with target tile
return ((tileset != a.tileset) || (clip != a.clip));
}
};
对于这个应用程序,我希望最终生成大小超过50000x50000个瓦片的地图,跨越不确定(但可能永远不会超过10个(层。总共大约有12个区域,而且这个数字是恒定的。
地图编辑器有一些控件来更改地图的大小(数字输入和按钮(。当我将映射大小设置为一个非常大的数字时,我会对每个向量调用vector.resize((,我可以在任务管理器中观察我的内存使用情况快速上升,直到我的计算机最终崩溃。
有人能为我提供一些处理超大矢量的建议或技巧吗?我是否必须做一些事情,比如压缩向量,使单个索引描述一系列相似的瓦片?我应该将映射存储在一个文件中而不是内存中,然后根据需要一次只读取几个块吗?
优秀的程序员如何处理这种情况?
正如在评论中已经提到的,您正试图只为数据分配大量内存。
在这种情况下,您必须选择不同的数据结构来存储它并使用它进行操作
这里有几个最简单的技巧,你可以应用于操作数据的代码的复杂性成本:
- 您的默认值似乎毫无意义。为什么不在内存中只存储设置为真值的数据呢
- 你可以在内存中只存储可见的部分数据(请参阅每次移动相机时地平线上发生的事情:零黎明)
- 您可能需要打包数据结构并处理对齐(请参见数据结构对齐(
当然,有时你必须限制需求,但这是生活的一部分。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存