某些系统(如Symbian)在分配时坚持让人们使用堆而不是堆栈 大对象(例如路径名,可能超过512个字节)。这有什么特别的原因吗?
答案 0 :(得分:3)
通常,嵌入式设备上的堆栈固定为非常小,即8K是Symbian上的默认堆栈大小。
如果你认为最大长度文件名是256字节,但是对于unicode来说已经加倍了,只有1个文件名已经是512字节(整个堆栈的1/16)。所以你可以想象,如果你不小心的话,很容易用掉堆栈。
答案 1 :(得分:3)
大多数Symbian设备都配有MMU,但直到最近,才支持分页。这意味着物理RAM将为每个正在运行的进程提交。 Symbian上的每个线程(通常)都有一个固定的8KB堆栈。如果每个线程都有一个堆栈,那么将该堆栈的大小从8KB增加到32KB会对设备的内存需求产生很大影响。
堆是全局的。如果需要,增加其大小的影响要小得多。因此,在Symbian上,堆栈仅用于小数据项 - 从堆中分配更大的数据项。
答案 2 :(得分:2)
嵌入式设备通常具有固定大小的堆栈。由于C中的子程序调用只需要将几个字压入堆栈,因此几百字节就足够了(如果你避免使用递归函数调用)。
答案 3 :(得分:1)
大多数嵌入式设备没有内存管理单元,因此操作系统无法自动增加堆栈空间,对程序员来说是透明的。即使假设一个可增长的堆栈,你也必须自己管理它,这并不比堆分配更好,并且首先要破坏使用堆栈的目的。
答案 4 :(得分:0)
嵌入式设备的堆栈通常驻留在极少量的高速内存中。如果在此类设备上的堆栈上分配大对象,则可能面临堆栈溢出。