C结构体与C++类的本质与区别

本文探讨了C与C++在汇编层面的一致性,深入解析了结构体、类作为参数时的栈区存储机制,以及成员函数中this指针的作用。通过对比不同参数传递方式的效率,阐述了封装的概念,并展示了类与结构体的区别,特别是虚函数引入的影响。

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: }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值