在C#中,值类型(例如:int,float等)存储在堆栈中.方法参数也可以存储在堆栈中.但是,大多数其他内容都存储在堆上.这包括列表,对象等.
我想知道,CPython内部是否做同样的事情?它在堆栈上存储了什么,它在堆上放了什么?
在C中捕获堆栈溢出的最佳方法是什么?
进一步来说:
AC程序包含脚本语言的解释器.
脚本不受信任,可能包含无限的递归错误.口译员必须能够抓住这些并顺利地继续下去.(显然,这可以通过使用软件堆栈来部分处理,但是如果可以用C语言编写大量的库代码块,性能会大大提高;至少,这需要在脚本创建的递归数据结构上运行C函数.)
捕获堆栈溢出的首选形式将涉及longjmp返回主循环.(丢弃在主循环下面的堆栈帧中保存的所有数据是完全可以的.)
回退可移植解决方案是使用局部变量的地址来监视当前堆栈深度,并使用每个递归函数来包含对使用此方法的堆栈检查函数的调用.当然,这会在正常情况下产生一些运行时开销; 这也意味着如果我忘记将堆栈检查调用放在一个地方,解释器将有一个潜在的错误.
有没有更好的方法呢?具体来说,我不期待更好的可移植解决方案,但如果我有一个针对Linux的系统特定解决方案和另一个适用于Windows的解决方案,那就没关系.
我见过在Windows上引用了一些称为结构化异常处理的东西,尽管我看过的引用一直是将它转换为C++异常处理机制; 可以从C访问它,如果是这样,它对这种情况有用吗?
我了解Linux可以捕获分段故障信号; 是否可以将其可靠地转换为longjmp回到主循环?
Java似乎支持在所有平台上捕获堆栈溢出异常; 它是如何实现的?