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


    结论:

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

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

    前言

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

                 ps:   双重异常

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

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

    追寻踪迹

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

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

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

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

     问题描述

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

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

    解决效果

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

    call stack :

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

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

    总结解决办法

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

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

  • 相关阅读:
    大数据实验三-HBase编程实践
    Exploration by random network distillation论文笔记
    VirtualBox网络连接方式学习笔记
    搭建Docker私有镜像仓库
    实践讲解Spring配置中心config(图+文,本地文件方式)
    Pod探针(probe)
    LeetCode7-整数反转
    CSAPP Lab5- MallocLab
    接口测试常用工具及测试方法
    顺应电商趋势,B2B平台深受制造业商家青睐
  • 原文地址:https://blog.csdn.net/qq_31314583/article/details/127803121