C++ 继承之栈溢出对象大小涉及的编程规范

结论:

        尽量使用引用,指针传参返回。(也可将其封装于小巧的类中)

        尽量让声明的结构处于堆上(多使用new生成结构)

前言

        在驱动用上C++的第 N+1天,我的驱动发生了双重异常

             ps:   双重异常

                             即,当一个异常发生时,堆栈会压入处理异常相关的数据和函数调用,但是次数如果再次发生异常,则称之为双重异常

         而栈溢出则是十分常见的双重异常,当栈耗尽时产生双重异常,但此时栈已经耗尽,触发异常时依旧会异常,因此触发双重异常。

追寻踪迹

        我们在多继承的每层构造函数下断,并且实时观察RSP寄存器的值。我的值如下

        1、可以发现在第四次时栈出现了大量的增长,我们可以在其中找到一些端倪

 此时是我在返回值中使用了超大结构体

         2、我们可以将每个类的大小打印出来,我的栈信息如下。

 问题描述

        1、我们在调用函数传参和返回时使用了巨大的结构体或类,且也不在函数内定义过大的对象

        2、我们在代码中可以轻易地发现,我们在类内部定义了巨大的结构体,并未使用指针,因此该结构作为类的一部分,在生成时生成

解决效果

        传参使用引用,尽量使用堆,继承等结构保持不变得到结果

call stack :

        修改后,调用栈的消耗从接近10K 降低至  600字节

 修改后各类对象大小,降低至几百字节

总结解决办法

        1、传参和返回时尽量使用引用,或者使用较小的对象

        2、在类内部不应该直接定义过多的类属性,而是使用单独的类或结构体,并在构造中new,使其存在于堆栈上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值