动态分配或浪费内存
Dynamically allocate or waste memory?
我有一个用于瓦片映射的2d整数数组。
映射的大小未知,并且在运行时从文件中读取。目前最大的文件是2500个项目(50x50网格)。
我在前面的问题中有一个动态内存分配的工作方法,但人们一直说这是个坏主意,所以我一直在考虑是否只使用一个大数组,而不是在使用较小的映射时将其全部填满。
人们知道这两种解决方案的利弊吗?欢迎任何建议或个人意见。
c++btw
编辑:所有的地图都是我做的,所以我可以选择一个最大尺寸。
例如,最简单的方法可能是使用std::vector<std::vector<int> >
来动态调整其大小,并让库为您完成所有分配。这样可以防止内存意外泄漏。
我更喜欢动态分配。这样,如果您遇到一个大得惊人的地图,如果您写得正确,您(希望)不会溢出,而对于固定大小的地图,您唯一的选择是返回错误并失败。
据推测,加载瓦片映射是一种非常罕见的操作。我也愿意打赌,你甚至无法测量两者之间有意义的速度差异。除非出现可测量的性能下降,或者您实际上遇到了其他导致您出现问题的问题,否则静态大小的优化似乎是过早的优化,并且会在以后带来麻烦。
这完全取决于您没有说明的需求:-)
-
如果你想让你的应用程序尽可能快,无法处理更大的平铺贴图,那么无论如何都要使用一个大数组。对于基于PIC的小型嵌入式系统来说,这可能是一种理想的方法。
-
但是,如果您希望代码健壮、可扩展、可维护,并且通常适合更广泛的受众,请使用STL容器。
-
或者,如果您只想学习一些东西,而不关心可维护性或性能,那么可以尝试从头开始编写自己的动态分配容器。
我相信人们所说的动态分配问题是由于分配了随机大小的内存块,而无法有效管理释放时留下的随机大小的漏洞。如果您正在分配固定大小的磁贴,那么这可能不是问题。
我看到不少人建议分配一大块内存并自己管理。这可能是另一种解决方案。
动态分配内存是程序中的瓶颈吗?这是性能问题的原因吗?如果没有,那么只需保持动态分配,就可以处理任何映射大小。如果是,那么可以使用一些数据结构,它不会解除分配它已经分配的内存,而是使用它的旧缓冲区,如果需要,可以重新分配更多的内存。
- 对具有动态分配的内存和析构函数的类对象的引用
- 调用析构函数以释放动态分配的内存
- 在运行时为动态分配的内存输入值
- 释放动态分配的内存时是否需要执行此额外步骤
- 动态分配字符数组的内存
- 销毁C++中动态分配的内存(数组对象)
- 删除类成员的动态分配内存的最佳方法是什么
- 动态分配的内存构造函数
- 为什么动态分配的内存总是16字节对齐
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 为什么动态分配的两个变量的内存位置不是连续的?
- 为浮点数组动态分配内存
- 动态分配 8 字节的内存
- 包含动态分配内存作为值的映射的取消定位速度有多快?
- STD分配器是否会在堆上动态分配内存?它可以安全地删除内存吗?
- 为什么不能在 Visual C++ 中动态分配堆栈内存?但海湾合作委员会可以做到
- 在C 中动态分配的内存的问题
- 为什么在 C++ 执行删除操作后仍可以访问释放的动态分配的内存
- 对内存动态分配的类不使用"*"的逻辑
- 如果我将内存动态分配给静态变量,我应该释放它还是会自动释放它