我读了一些关于堆栈和堆内存的信息。这里的所有优点和缺点:What and where are the stack and heap?
然而我总是有这个问题。我应该为我的变量使用堆栈还是堆? 刚才我有一个大约10kb的结构。
你有什么建议?我应该在堆栈或堆上分配它吗? 它们都有优点和缺点
提前致谢。
答案 0 :(得分:1)
在像Rasberry Pi这样的小型计算机上,10Mbyte堆栈是不合理的。
call stack上的典型堆栈帧应该是几千字节(特别是对于最近的软件,它具有许多调用深度函数,例如使用Qt或Gtk等工具包时)。
所以我建议在你的情况下使用堆。
BTW,一旦你malloc
- 指针,访问它(在堆栈或堆上)几乎是等效的(有缓存,但如果你经常访问它,它将保留在L1缓存中)。典型的malloc
(或free
)需要几十微秒。因此,对于一千个这样的数据,堆并不是什么大问题。
当然,您需要小心避免memory leaks(free
- 适当地malloc
- ed数据。也许使用valgrind。
您可以考虑使用Boehm's conservative garbage collector,然后您将代码GC_MALLOC
和GC_STRDUP
代替malloc
和strdup
,您不会打扰{{} 1}} - 数据。
答案 1 :(得分:1)
在堆栈中分配变量既简单又快速,但缺点是堆栈有限,堆慢但更大。
一旦离开范围,堆栈中分配的值也是deleted
,因此它可以适用于原始变量等小局部值,但对于大型变量不适用。另外,如果你在堆栈中分配太多,你可能会用完堆栈,但Heap不是这样的。
答案 2 :(得分:1)
I'm going to use it globally in the whole program
除非你将变量传递给你调用的每个函数,否则它不会在堆栈上起作用。
在堆上预先分配它,特别是因为你知道最大大小。
答案 3 :(得分:1)
这真是一个明智的选择。在堆上分配它。 malloc空间所需的几个周期甚至不是考虑到将要保留的东西,每5秒更新一次,并且可以全天候访问。
更难的问题是,是否全局指针或通过你调用的每个函数传递它。根据您的描述,这似乎是全局合理的案例之一。