深栈展开
Deep stack unwinding
首先,这肯定是关于C的,没有要求C++解决方案。
目标:
Return 超出多个堆栈帧的调用函数 (A
)。
我有一些解决方案,但感觉没有一个是最好的选择。
从实现的意义上来说最简单的是longjmp/setjmp,但我不确定
如果它破坏了自动变量,因为正如 wiki 所指,没有正常的堆栈展开
如果执行 longjmp,则参与。
这里是程序流程的简短描述:
A
函数调用 file processing
函数,这导致许多内部
和递归调用。在某些时候,文件阅读器遇到了 EOF,所以
file processing
已完成,应将控制权交给 A
函数。
将每个读取的字符与 EOF 或“\0”进行比较?不,谢谢。
UPD:我可以避免在 setjmp 和 longjmp 之间的调用链中进行动态分配。
不确定自动变量,我不知道顺序调用会发生什么
到 file processing
(有超过 1 个文件)。
所以:
1) longjmp 的 'no stack unwinding' 怎么样?如果我得到所有的东西会有多危险
可用的数据持有者(指针)。
2) 返回 A
框架的其他简洁有效的方法?
我不知道您在某处读到了什么,但是 setjmp/longjmp
正是为该任务预见的工具。
longjmp
重新建立 "stack" 完全(有点),就像它在调用 setjmp
时一样,对 "stack" 的所有修改两者之间完成的所有操作都丢失了,包括所有已定义的 auto
变量。这种栈的重新建立是brute forward,在C中没有析构函数的概念,这可能是"no stack unwinding".
的意思
我把 "stack" 放在引号中,因为这不是 C 标准适用的术语,它只讨论状态并允许按照实现的方式进行组织。
现在,从 setjmp
到 longjmp
之间,您能够保留的唯一信息是:
- 您传递给
longjmp
的值
- 您在
setjmp
之前定义的已修改 volatile
对象的值
因此,在您从 longjmp
返回的分支中,您必须使用此(且仅此)信息来清理您的混乱:关闭文件,free
个您 malloced
的对象]等
首先,这肯定是关于C的,没有要求C++解决方案。
目标:
Return 超出多个堆栈帧的调用函数 (A
)。
我有一些解决方案,但感觉没有一个是最好的选择。
从实现的意义上来说最简单的是longjmp/setjmp,但我不确定 如果它破坏了自动变量,因为正如 wiki 所指,没有正常的堆栈展开 如果执行 longjmp,则参与。
这里是程序流程的简短描述:
A
函数调用 file processing
函数,这导致许多内部
和递归调用。在某些时候,文件阅读器遇到了 EOF,所以
file processing
已完成,应将控制权交给 A
函数。
将每个读取的字符与 EOF 或“\0”进行比较?不,谢谢。 UPD:我可以避免在 setjmp 和 longjmp 之间的调用链中进行动态分配。
不确定自动变量,我不知道顺序调用会发生什么
到 file processing
(有超过 1 个文件)。
所以:
1) longjmp 的 'no stack unwinding' 怎么样?如果我得到所有的东西会有多危险 可用的数据持有者(指针)。
2) 返回 A
框架的其他简洁有效的方法?
我不知道您在某处读到了什么,但是 setjmp/longjmp
正是为该任务预见的工具。
longjmp
重新建立 "stack" 完全(有点),就像它在调用 setjmp
时一样,对 "stack" 的所有修改两者之间完成的所有操作都丢失了,包括所有已定义的 auto
变量。这种栈的重新建立是brute forward,在C中没有析构函数的概念,这可能是"no stack unwinding".
我把 "stack" 放在引号中,因为这不是 C 标准适用的术语,它只讨论状态并允许按照实现的方式进行组织。
现在,从 setjmp
到 longjmp
之间,您能够保留的唯一信息是:
- 您传递给
longjmp
的值
- 您在
setjmp
之前定义的已修改
volatile
对象的值
因此,在您从 longjmp
返回的分支中,您必须使用此(且仅此)信息来清理您的混乱:关闭文件,free
个您 malloced
的对象]等