【问题标题】:Dynamically allocate or waste memory?动态分配还是浪费内存?
【发布时间】:2011-08-31 23:51:55
【问题描述】:

我有一个用于平铺地图的二维整数数组。

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

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

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

c++ 顺便说一句

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

【问题讨论】:

  • 您有什么理由不能使用 STL 来维护您的数组,以免自己为自己动态分配数组而烦恼?
  • @Doug T 你说的是 STL 的哪一部分。我考虑过使用向量,但由于数组一次完全填充,并且唯一一次编辑它是使用将替换所有数据的新地图。
  • Re: 编辑 - 即使它们都是由您制作的,如何阻止有人恶意向您的用户发送一个故意溢出并在以后利用固定大小的文件?
  • @awoodland 离开话题购买有人这样做有什么意义?我看不出它的目的?
  • @Skeith,Mark B 的回答会起作用

标签: c++ arrays data-structures dynamic-memory-allocation


【解决方案1】:

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

【讨论】:

  • +1,STL 容器在任何时候都胜过用数组弄脏手!
  • 既然他可以从文件大小中猜出向量的大小,他应该使用向量reserve()方法来防止在重新分配上浪费大量时间。
  • @Jay - 为 50x50 保留空间可能是两全其美!
  • 不需要保留:改用vector的迭代器范围构造函数。
【解决方案2】:

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

大概加载平铺地图是一种非常少见的操作。我也愿意打赌,您甚至无法衡量两者之间有意义的速度差异。除非有可衡量的性能降低,或者您实际上遇到了其他导致问题的东西,否则静态大小的优化似乎是一种过早的优化,以后会自找麻烦。

【讨论】:

    【解决方案3】:

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

    • 如果您希望您的应用程序尽可能快,但无法处理更大的平铺地图,那么请务必使用大数组。对于基于 PIC 的小型嵌入式系统,这可能是一种理想的方法。

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

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

    【讨论】:

    • 我对性能有点感兴趣,因为当玩家在区域之间移动时要加载的不仅仅是地图,我希望加载屏幕尽可能少于 2 秒,但我更感兴趣的是“节省的”内存值得动态分配产生的问题吗?
    • @Skeith 请记住,与实际的文件 I/O 相比,这些选项中的任何一个都将同样快速。
    • @SKeith:除非你看到它们,否则不要担心“动态内存问题”。而你不会。
    【解决方案4】:

    我相信人们提到的动态分配问题是由于分配随机大小的内存块而无法有效管理释放时留下的随机大小的空洞。如果您要分配固定大小的图块,那么这可能不是问题。

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

    【讨论】:

    • 使用基于 STL 的解决方案,您可以从使用 std::vector 开始,然后更改分配器 if 内存碎片确实是一个问题。不过,在早期阶段不这样做似乎是不必要的悲伤。
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 2013-01-02
      • 1970-01-01
      • 2012-06-23
      • 2021-07-14
      • 2021-07-06
      • 1970-01-01
      相关资源
      最近更新 更多