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
类似赋值的浅拷贝 但是涉及到 类中指针变量 就需要使用时进行深拷贝 可能会找出资源多次释放问题
从此山高路远,纵马扬鞭。愿往后旅途,三冬暖,春不寒,天黑有灯,下雨有伞。此生尽兴,不负勇往。