• c++结构体与类反汇编特征


    测试实例

    #include <iostream>
    
    class MyClass
    {
    public:
    
        MyClass();
        ~MyClass();
    
        int getn()
        {
            return n;
        }
        int getm()
        {
            return m;
        }
    private:
        int m;
        int n;
    };
    
    MyClass::MyClass()
    {
        m = 10;
        n = 9;
    }
    
    MyClass::~MyClass()
    {
    }
    
     int main()
    {
         MyClass test;
        
    
    
    }

    先看一下 在 debug x86 下得 内存结构

     可以很清楚看到 变量内存方式 这是最简单得结构  实际开发中结构会很复杂  类储存本质和结构体一至 都是内存对齐 安最大对齐字节对齐 

    这里可以改变 int 类型位其它类型 看他的内存分布

     

     把第二个参数改成char 可以看到4字节对齐了 依旧满足最大类型对齐  4+4=8;

     唯一特别得是  当类中没有一个成员时空类只占1个字节 用于没有类成员数据但是有成员函数得情况 

    类成员中静态数据成员不参与计算 不和类普通成员存储在一起

     

     2个地址 汇编一个全局区堆存储  类其它成员 直接走的栈储存了

    接着看类函数调用

     这里push 一个8  j接着把类指针 给了 ecx 和常规得函数调用不同 多了一个 本身类指针

     前面就是保存寄存器值 开辟局部变量空间 这个可以在 内存直接看到 一堆cc 把类指针取出来给放到栈中  eax=类指针 指针迁移第4个字节 就是int类型 就是第二个参数 n接着在栈中找temp相加

    在看一下x64的汇编

     可以看到没啥变化 再看一下优化版的

     没看到 直接优化成常数了。

    在观察一下 除常数 传递类本身

     依旧会把指针给ecx

     类似赋值的浅拷贝 但是涉及到 类中指针变量 就需要使用时进行深拷贝 可能会找出资源多次释放问题

    从此山高路远,纵马扬鞭。愿往后旅途,三冬暖,春不寒,天黑有灯,下雨有伞。此生尽兴,不负勇往。
  • 相关阅读:
    CCF——分蛋糕(2017-3)
    CCF——公共钥匙盒(2017-9)
    CCF——打酱油(2017-9)
    CCF——游戏(2017-12)
    SDS-简单动态字符串
    Redis主从复制
    MySQL 知识点
    MySQL 死锁
    Java 类加载机制
    Java IO
  • 原文地址:https://www.cnblogs.com/feizianquan/p/15025516.html
Copyright © 2020-2023  润新知