1、从汇编上看,C与C++本质是一样的,只是C++由编译器添加了一些新的东西;
2、结构体和类作为参数传递时,一样是存于栈区,由esp-0xAA来拉高栈顶,然后一个个成员赋值到栈顶,如果成员多了,赋值多了,效率就会很低,所以,参数和返回值 最好是使用指针进行传参;
如果是基本类型数据,使用的是Push... ;
3、体会封装:封装就是将函数定义在结构体中,成员函数能直接使用成员函数,默认this指针存于ECX:this指针表示本对象的首地址,this指针不支持任何操作,只能用来访问数据和成员函数的参数;this指针不占当前结构体的宽度;
4、类:带函数的结构体被成为类,里面的成员函数是不占用空间的,有虚函数就加4字节虚表指针;
参考代码如下:
struct student1
{
int a;
int b;
int c;
};
int plusMethod(student1 s)
{
return s.a + s.b + s.c;
}
struct student2
{
int a;
int b;
int c;
};
int plusMethod(student2* s)
{
return s->a + s->b + s->c;
}
struct student3
{
int a;
int b;
int c;
int plusMethod()
{
return a + b + c;
}
};
103: int main()
104: {
00052820 55 push ebp
00052821 8B EC mov ebp,esp
00052823 81 EC 00 01 00 00 sub esp,100h
00052829 53 push ebx
0005282A 56 push esi
0005282B 57 push edi
0005282C 8D BD 00 FF FF FF lea edi,[ebp-100h]
00052832 B9 40 00 00 00 mov ecx,40h
00052837 B8 CC CC CC CC mov eax,0CCCCCCCCh
0005283C F3 AB rep stos dword ptr es:[edi]
0005283E A1 10 F0 05 00 mov eax,dword ptr ds:[0005F010h]
00052843 33 C5 xor eax,ebp
00052845 89 45 FC mov dword ptr [ebp-4],eax
105: student1 s = {1,2,3};
00052848 C7 45 EC 01 00 00 00 mov dword ptr [s],1
0005284F C7 45 F0 02 00 00 00 mov dword ptr [ebp-10h],2
00052856 C7 45 F4 03 00 00 00 mov dword ptr [ebp-0Ch],3
106: plusMethod(s);
0005285D 83 EC 0C sub esp,0Ch ; 结构体传参esp-0xC,0xC为结构大小;
00052860 8B C4 mov eax,esp
00052862 8B 4D EC mov ecx,dword ptr [s]
00052865 89 08 mov dword ptr [eax],ecx ;第一个参数
00052867 8B 55 F0 mov edx,dword ptr [ebp-10h]
0005286A 89 50 04 mov dword ptr [eax+4],edx ;第二个参数
0005286D 8B 4D F4 mov ecx,dword ptr [ebp-0Ch]
00052870 89 48 08 mov dword ptr [eax+8],ecx ;第三个参数
00052873 E8 3E EB FF FF call plusMethod (0513B6h) ;全局函数
00052878 83 C4 0C add esp,0Ch
107:
108: student2 s2 = {};
0005287B 33 C0 xor eax,eax
0005287D 89 45 D8 mov dword ptr [s2],eax
00052880 89 45 DC mov dword ptr [ebp-24h],eax
00052883 89 45 E0 mov dword ptr [ebp-20h],eax
109: plusMethod(&s2);
00052886 8D 45 D8 lea eax,[s2]
00052889 50 push eax
0005288A E8 5F EA FF FF call plusMethod (0512EEh) ;传结构体首地址指针更方便
109: plusMethod(&s2);
0005288F 83 C4 04 add esp,4 //平栈
110:
111: student3 s3 = {1,2,3};
00052892 C7 45 C4 01 00 00 00 mov dword ptr [s3],1
00052899 C7 45 C8 02 00 00 00 mov dword ptr [ebp-38h],2
000528A0 C7 45 CC 03 00 00 00 mov dword ptr [ebp-34h],3
112: s3.plusMethod();
000528A7 8D 4D C4 lea ecx,[s3] ;this指针
000528AA E8 A4 E9 FF FF call student3::plusMethod (051253h) ;实际也是全局地址,只是限定到了student3中;
113:
114: return 0;
000528AF 33 C0 xor eax,eax
115: }
本文探讨了C与C++在汇编层面的一致性,深入解析了结构体、类作为参数时的栈区存储机制,以及成员函数中this指针的作用。通过对比不同参数传递方式的效率,阐述了封装的概念,并展示了类与结构体的区别,特别是虚函数引入的影响。

1万+

被折叠的 条评论
为什么被折叠?



