1

我阅读了有关堆栈和堆内存的更多信息。这里的所有优点和缺点:堆栈和堆是什么以及在哪里?

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

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

你有什么建议?我应该在堆栈还是堆上分配它?它们都有优点和缺点

提前致谢。

4

4 回答 4

1

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

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

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

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

当然,您需要小心避免内存泄漏(通过对-ed 数据进行free适当的 -ing )。malloc也许使用valgrind

您可能会考虑使用Boehm 的保守垃圾收集器,然后您将编写代码GC_MALLOCGC_STRDUP而不是mallocand,strdup并且您不会打扰free数据。

于 2013-10-24T19:37:04.853 回答
1

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

此外,在堆栈中分配的值是deleted一旦您离开范围,因此它可能适用于像原始变量这样的小局部值,但不适用于大小较大的变量。此外,如果您在堆栈中分配太多,您可能会用完堆栈,但堆并非如此

于 2013-10-24T19:37:22.677 回答
1

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

这在堆栈上不起作用,除非您将变量传递给您调用的每个函数。

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

于 2013-10-24T19:38:18.253 回答
1

这真的是不费吹灰之力。在堆上分配它。malloc 空间所花费的几个周期甚至不考虑将保持原位的东西,每 5 秒更新一次,并且可以 24/7 访问。

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

于 2013-10-24T19:58:35.560 回答