wah*_*hab 2 c c++ embedded recursion memory-management
当我定义一个递归函数时,在堆上分配局部变量,然后在函数返回之前清除它们比在堆栈上分配它们更好/更安全.嵌入式系统上的堆栈大小非常有限,当递归运行得太深时,存在堆栈溢出的危险.
答案取决于您的应用程序域和平台的细节."嵌入式系统"是一个模糊的术语.一个运行MS Windows或Linux大示波器是在光谱的一端.其中大部分都可以像普通PC一样进行编程.他们不应该失败,但如果他们这样做,只需重新启动它们.
另一方面是安全关键领域的控制器.考虑一下这些西门子开关必须在几毫秒内在所有情况下做出反应.失败不是一种选择.他们可能不运行Windows.可用资源有限.编程规则和程序在这里有很大不同.
现在让我们通过动态或自动内存分配来检查你拥有的选项,递归(或不是!).
在性能方面,堆栈更快,因此它是首选.动态分配还涉及一些用于簿记的内存开销,如果数据单元很小则这是很大的.并且可能存在内存碎片问题,这些问题不会出现在自动内存中(尽管导致碎片的场景 - 对象的不同生命周期 - 如果没有动态分配,可能无法直接解决).
但确实在某些系统上,堆栈大小(大大小)比堆大小小; 您必须阅读有关系统内存布局的信息.示波器将拥有大量内存和大堆栈; 电源开关不会.
如果你担心内存不足,我会遵循Christian的建议,完全避免递归,而是使用循环.迭代可能会使内存使用率保持不变.此外,递归总是使用堆栈空间,例如返回地址和-value.动态分配"局部"变量的想法只对较大的数据结构有意义,因为你仍然必须将数据指针作为自动变量保存,这会占用堆栈空间(并且会增加整体内存占用量) .
通常,在资源有限的系统上,限制程序的最大资源使用非常重要.时间也是一种资源; 动态分配使实时几乎不可能.
应用领域决定了安全要求.在安全关键领域(起搏器!),程序一定不会失败.除非该计划是微不足道的,否则这个理想是不可能实现的,但是要做出很大的努力才能接近.在其他字段中,程序可能会在无法处理的情况下以定义的方式失败,但它不能以静默方式或以未定义的方式失败(例如,通过覆盖数据).例如,不是动态分配未知数量的数据,而是只有一个固定大小的数据的预定义数组,而是使用绑定检查来使用数组中的元素.