堆栈还是堆?为已知大小变量选择哪一个?

时间:2013-10-24 19:33:55

标签: c linux stack heap raspberry-pi

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

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

  • 我将在整个程序中全局使用它
  • 我知道必要结构的最大数量是1000.(总共10MB)
  • 有时我只会使用其中一个,所以剩下的999都是空的。
  • 我不会再使用任何一次。
  • 该程序将在Linux上运行24/7(带有512MB RAM的raspberry Pi)并且我将在5秒间隔内访问单个结构。

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

提前致谢。

4 个答案:

答案 0 :(得分:1)

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

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

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

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

当然,您需要小心避免memory leaksfree - 适当地malloc - ed数据。也许使用valgrind

您可以考虑使用Boehm's conservative garbage collector,然后您将代码GC_MALLOCGC_STRDUP代替mallocstrdup,您不会打扰{{} 1}} - 数据。

答案 1 :(得分:1)

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

一旦离开范围,堆栈中分配的值也是deleted,因此它可以适用于原始变量等小局部值,但对于大型变量不适用。另外,如果你在堆栈中分配太多,你可能会用完堆栈,但Heap不是这样的。

答案 2 :(得分:1)

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

除非你将变量传递给你调用的每个函数,否则它不会在堆栈上起作用。

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

答案 3 :(得分:1)

这真是一个明智的选择。在堆上分配它。 malloc空间所需的几个周期甚至不是考虑到将要保留的东西,每5秒更新一次,并且可以全天候访问。

更难的问题是,是否全局指针或通过你调用的每个函数传递它。根据您的描述,这似乎是全局合理的案例之一。