2011-05-24 120 views
4

我有一个2d整型数组用于瓷砖地图。动态分配或浪费内存?

地图的大小未知,并在运行时从文件读入。目前最大的文件是2500件(50x50格)。

我有一个动态内存分配的工作方法从一个早期的问题,但人们不断说这是一个坏主意,所以我一直在考虑是否只使用一个大数组,并没有填补所有使用较小地图。

人们是否知道任何解决方案的优缺点?任何建议或个人意见的欢迎。

C++ BTW

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

+3

任何你不能使用STL来维护你的数组来保存自己动态分配数组的麻烦的原因? – 2011-05-24 14:19:11

+0

@Doug T你在谈论STL的哪一部分。我想过使用矢量,但是因为数组一次完全填满,并且唯一编辑的时间是使用新的地图来替换所有的数据。 – Skeith 2011-05-24 14:22:29

+0

Re:编辑 - 即使它们都是由你制作的,是什么阻止了某个人恶意向你的用户发送一个故意溢出并在以后使用固定大小的用户? – Flexo 2011-05-24 14:26:17

回答

2

我的偏好是动态分配。这种方式应该会遇到一个令人惊讶的大地图(如果你已经正确地写了它,你希望不会溢出),而在固定大小的情况下,唯一的选择是返回一个错误并失败。

推测加载瓷砖地图是一个非常罕见的操作。我也愿意打赌,你甚至无法衡量两者之间的速度差异。除非有可衡量的性能下降,否则你实际上遇到了其他问题,导致你的问题,静态大小似乎是一个不成熟的优化,并在稍后要求麻烦。

9

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

+1

+1,STL容器胜过每天都有阵列脏手! – Flexo 2011-05-24 14:22:12

+2

由于他可以从文件大小中猜测矢量的大小,所以他应该使用vector reserve()方法来防止在重新分配时浪费大量时间。 – Jay 2011-05-24 14:22:52

+0

@Jay - 预留50x50的空间可能是两全其美的! – Flexo 2011-05-24 14:24:20

1

我相信人们通过分配随机大小的内存块来指向动态分配结果的问题,并且无法有效地管理释放时留下的随机大小的空洞。如果你正在分配固定大小的瓷砖,那么这可能不是问题。

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

+1

使用基于STL的解决方案,您可以开始使用std :: vector,然后更改分配器*如果*内存碎片确实是一个问题。否则在早期阶段做这件事似乎是不必要的悲伤。 – Flexo 2011-05-24 14:23:04

1

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

2

这完全取决于如果你希望你的应用程序是为极快地你还没有:-)

  • 规定的要求,没有能力处理大型瓷砖的地图,然后通过各种意味着只使用一个大阵列。对于基于PIC的小型嵌入式系统来说,这可能是一种理想的方法。但是,如果您希望自己的代码稳健,可扩展,可维护并且通常适用于更广泛的受众群体,请使用STL容器。或者,如果您只是想学习东西,并且不关心可维护性或性能,请尝试编写您自己的从头开始动态分配容器。

+0

我对性能有点感兴趣,因为当玩家在两个区域之间移动时,要载入的地图超过了地图,如果可能的话,我希望载入屏幕不到2秒,但我更感兴趣的是“已保存”的内存是否值得动态分配产生的问题? – Skeith 2011-05-24 14:28:00

+0

@Skeith请记住,相比于实际的文件I/O,这些选项中的任何一个都可以实现同样的快速。 – 2011-05-24 16:01:25

+0

@Seeith:不要担心“动态内存问题”,除非你看到它们。而你不会。 – Roddy 2011-05-24 16:11:44