结论:
尽量使用引用,指针传参返回。(也可将其封装于小巧的类中)
尽量让声明的结构处于堆上(多使用new生成结构)
前言
在驱动用上C++的第 N+1天,我的驱动发生了双重异常
ps: 双重异常
即,当一个异常发生时,堆栈会压入处理异常相关的数据和函数调用,但是次数如果再次发生异常,则称之为双重异常
而栈溢出则是十分常见的双重异常,当栈耗尽时产生双重异常,但此时栈已经耗尽,触发异常时依旧会异常,因此触发双重异常。
追寻踪迹
我们在多继承的每层构造函数下断,并且实时观察RSP寄存器的值。我的值如下
1、可以发现在第四次时栈出现了大量的增长,我们可以在其中找到一些端倪
此时是我在返回值中使用了超大结构体
2、我们可以将每个类的大小打印出来,我的栈信息如下。
问题描述
1、我们在调用函数传参和返回时使用了巨大的结构体或类,且也不在函数内定义过大的对象
2、我们在代码中可以轻易地发现,我们在类内部定义了巨大的结构体,并未使用指针,因此该结构作为类的一部分,在生成时生成
解决效果
传参使用引用,尽量使用堆,继承等结构保持不变得到结果
call stack :
修改后,调用栈的消耗从接近10K 降低至 600字节
修改后各类对象大小,降低至几百字节
总结解决办法
1、传参和返回时尽量使用引用,或者使用较小的对象
2、在类内部不应该直接定义过多的类属性,而是使用单独的类或结构体,并在构造中new,使其存在于堆栈上