动态分配或浪费内存

Dynamically allocate or waste memory?

本文关键字:内存 动态分配      更新时间:2023-10-16

我有一个用于瓦片映射的2d整数数组。

映射的大小未知,并且在运行时从文件中读取。目前最大的文件是2500个项目(50x50网格)。

我在前面的问题中有一个动态内存分配的工作方法,但人们一直说这是个坏主意,所以我一直在考虑是否只使用一个大数组,而不是在使用较小的映射时将其全部填满。

人们知道这两种解决方案的利弊吗?欢迎任何建议或个人意见。

c++btw

编辑:所有的地图都是我做的,所以我可以选择一个最大尺寸。

例如,最简单的方法可能是使用std::vector<std::vector<int> >来动态调整其大小,并让库为您完成所有分配。这样可以防止内存意外泄漏。

我更喜欢动态分配。这样,如果您遇到一个大得惊人的地图,如果您写得正确,您(希望)不会溢出,而对于固定大小的地图,您唯一的选择是返回错误并失败。

据推测,加载瓦片映射是一种非常罕见的操作。我也愿意打赌,你甚至无法测量两者之间有意义的速度差异。除非出现可测量的性能下降,或者您实际上遇到了其他导致您出现问题的问题,否则静态大小的优化似乎是过早的优化,并且会在以后带来麻烦。

这完全取决于您没有说明的需求:-)

  • 如果你想让你的应用程序尽可能快,无法处理更大的平铺贴图,那么无论如何都要使用一个大数组。对于基于PIC的小型嵌入式系统来说,这可能是一种理想的方法。

  • 但是,如果您希望代码健壮、可扩展、可维护,并且通常适合更广泛的受众,请使用STL容器。

  • 或者,如果您只想学习一些东西,而不关心可维护性或性能,那么可以尝试从头开始编写自己的动态分配容器。

我相信人们所说的动态分配问题是由于分配了随机大小的内存块,而无法有效管理释放时留下的随机大小的漏洞。如果您正在分配固定大小的磁贴,那么这可能不是问题。

我看到不少人建议分配一大块内存并自己管理。这可能是另一种解决方案。

动态分配内存是程序中的瓶颈吗?这是性能问题的原因吗?如果没有,那么只需保持动态分配,就可以处理任何映射大小。如果是,那么可以使用一些数据结构,它不会解除分配它已经分配的内存,而是使用它的旧缓冲区,如果需要,可以重新分配更多的内存。