Plo*_*rzz 6 c heap recursion memory-management
我正在观看有关CUDA和Barnes-Hut算法的视频,其中声称有必要对GPU的树放置深度限制,然后想法可能会在堆中进行递归.
基本上,我只是想知道:是否有可能从堆中分配内存并将其用作临时"堆栈",在该堆栈中对有问题的递归函数进行函数调用以稍微延迟堆栈溢出?
如果是这样,如何实现,我们是否会为指向函数的指针分配空间?我假设它会涉及在堆中存储函数地址但是我不太确定.
[编辑]我只是想补充一点,这纯粹是一个理论问题,我想这样做会导致程序在使用堆时减慢速度.
[编辑]根据请求,我使用的编译器是Ubuntu 14.04(64位)上的GCC 4.8.4
当然。这称为连续传递风格。标准库通过setjmp()和 来支持它longjmp(),并存储将控制恢复到称为 的结构中的较早点所需的信息jmp_buf。(对于可以从何处恢复有一些限制。)您可以将它们存储在堆栈中,这只是一个 LIFO 队列。
更通用的方法是将程序作为状态机运行,并将回溯程序状态所需的信息(称为延续)存储在称为蹦床的数据结构中。想要这样做的一个常见原因是在一个实现中获得尾递归的等效项,该实现不会对其进行优化,并且可能会占用大量堆栈空间。我认识的人目前正在编写一个 Trampoline 的一个现实应用程序是 GLL 解析器,其中语法表示为有向图,解析的结果是共享的打包解析森林,并且解析器通常需要回溯以尝试不同的规则。
\n\n连续传递和蹦床似乎被认为是花哨的风格,因为它们来自函数式编程的世界,同时longjmp()被认为是丑陋的低级黑客,甚至 Linux 手册页也说不要使用它。