【问题标题】:Stack or heap?Which one to choose for known size variable?堆栈还是堆?已知大小变量选择哪一个?
【发布时间】:2013-11-03 16:39:05
【问题描述】:

我阅读了有关堆栈和堆内存的更多信息。这里的所有优点和缺点:What and where are the stack and heap?

但是我总是有这个问题。我应该为我的变量使用堆栈还是堆? 刚才我有一个大小为 10kb 的结构。

  • 我将在整个程序中全局使用它
  • 我知道必要结构的最大数量为 1000。(总共 10MB)
  • 有时我会只使用其中的一个,所以剩下的 999 是空的。
  • 我不会使用任何重复。
  • 该程序将在 linux(具有 512MB RAM 的树莓派)上 24/7 运行,我将在 5 秒间隔内访问单个结构。

你有什么建议?我应该在堆栈还是堆上分配它? 两者各有优缺点

提前致谢。

【问题讨论】:

    标签: c linux raspberry-pi heap-memory stack-memory


    【解决方案1】:

    10Mbyte 堆栈在像 Rasberry Pi 这样的小型计算机上是不合理的。

    call stack 上的典型堆栈帧应该是几千字节(特别是对于最近的软件,它们具有许多调用深度的函数,例如使用 Qt 或 Gtk 等工具包时)。

    所以我建议在你的情况下使用堆。

    顺便说一句,一旦你malloc-ed 一个指针,访问它(在堆栈或堆上)几乎是等效的(有缓存,但如果你经常访问它,它将保留在 L1 缓存中)。典型的malloc(或free)需要几十微秒。所以对于一千个这样的数据,堆并不是什么大问题。

    当然,您要小心避免memory leaks(通过free-ing 适当地malloc-ed 数据)。也许使用valgrind

    您可能会考虑使用Boehm's conservative garbage collector,然后您将编码GC_MALLOCGC_STRDUP 而不是mallocstrdup,这样您就不会打扰free-ing 数据。

    【讨论】:

    • 我有点害怕内存泄漏,所以我想知道一次分配整个 1000 个结构并有一个指向每个结构的指针不是更好。这样我就跳过了列表(尾部和头部),我想这不是我编程技能的可靠解决方案。
    【解决方案2】:

    在栈中分配变量既简单又快捷,但缺点是栈有限,堆比较慢但要大很多。

    一旦你离开作用域,分配在堆栈中的值也是deleted,所以它对于像原始变量这样的小局部值可能是好的,但对于大小很大的变量是不好的。此外,如果您在堆栈中分配太多,您可能会用完堆栈,但堆并非如此

    【讨论】:

      【解决方案3】:

      I'm going to use it globally in the whole program

      这在堆栈上是行不通的,除非你将变量传递给你调用的每一个函数。

      在堆上预先分配它,特别是因为您知道最大大小。

      【讨论】:

      • 另一种可能性是将来自main 的局部变量的地址(例如)分配给全局指针变量。这很丑陋但有效。因此,您可以使用这样的技巧堆栈分配全局数据。
      【解决方案4】:

      这真的很简单。在堆上分配它。 malloc 空间所花费的几个周期甚至不考虑将保留在原地、每 5 秒更新一次以及 24/7 访问的东西。

      稍微难一点的问题是,是全局使用指针还是将它传递给您调用的每个函数。从您的描述来看,这似乎是全球合理的情况之一。

      【讨论】:

        猜你喜欢
        • 2012-03-31
        • 2021-10-13
        • 2013-01-10
        • 2021-03-15
        • 1970-01-01
        • 2016-09-08
        • 2010-11-15
        • 2011-03-22
        • 1970-01-01
        相关资源
        最近更新 更多