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

 

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

 

posted @ 2021-07-17 23:30  紅人  阅读(81)  评论(0编辑  收藏  举报