1.指针
任何指针对汇编而言都是一样的,只不过在操作的时候才有区别
mov byte ptr [eax],2
mov dword ptr [ecx],4019999Ah
2.指针和引用
汇编层是一样的
- 004012FB lea ecx,[ebp-4]
- 004012FE push ecx
- 004012FF call @ILT+50(add_ref) (00401037)
3.类
如果没有虚函数,函数的调用是硬编码
- 65: fruit f;
- 0040132D lea ecx,[ebp-10h]
- 00401330 call @ILT+35(fruit::fruit) (00401028)
- 00401335 mov dword ptr [ebp-4],0
- 66: apple* a = (apple*)&f;
- 0040133C lea eax,[ebp-10h]
- 0040133F mov dword ptr [ebp-14h],eax
- 67: a->print();
- 00401342 mov ecx,dword ptr [ebp-14h]
- 00401345 call @ILT+0(apple::print) (00401005)
- 68: fruit* b = &f;
- 0040134A lea ecx,[ebp-10h]
- 0040134D mov dword ptr [ebp-18h],ecx
- 69: b->print();
- 00401350 mov ecx,dword ptr [ebp-18h]
- 00401353 call @ILT+25(fruit::print) (0040101e)
4.switch,break
int m = 10;
switch(m) -->
- mov eax,dword ptr [ebp-4]
- 004017B2 mov dword ptr [ebp-8],eax 为switch()中的m开辟一段栈内存
{}
break; -->
- break;
- 004017D0 jmp process+4Fh (004017df)
被汇编为一个无条件跳转指令
5.虚函数
在掉用函数时,通过
edx被赋予不同的值来实现多态,否则是硬编码
- 76: employee p;
- 0040127D lea ecx,[ebp-10h]
- 00401280 call @ILT+45(employee::employee) (00401032)
- 00401285 mov dword ptr [ebp-4],0
- 77: manager m;
- 0040128C lea ecx,[ebp-14h]
- 0040128F call @ILT+65(manager::manager) (00401046)
- 00401294 mov byte ptr [ebp-4],1
- 78: employee* e = &p;
- 00401298 lea eax,[ebp-10h]
- 0040129B mov dword ptr [ebp-18h],eax
- 79: e->print();
- 0040129E mov ecx,dword ptr [ebp-18h]
- 004012A1 call @ILT+5(employee::print) (0040100a)
- 80: e = &m;
- 004012A6 lea ecx,[ebp-14h]
- 004012A9 mov dword ptr [ebp-18h],ecx
- 81: e->print();
- 004012AC mov ecx,dword ptr [ebp-18h]
- 004012AF call @ILT+5(employee::print) (0040100a)
6.静态变量
就是取同一个地址
- 74: m.value = 10;
- 00401284 mov dword ptr [employee::value (00438494)],0Ah
- 75: n.value = 100;
- 0040128E mov dword ptr [employee::value (00438494)],64h
- 00401246 rep stos dword ptr [edi]
- 70: employee::print();
- 00401248 call @ILT+0(employee::print) (00401005)
汇编代码表明,两个compare调用的函数地址并不是一致的。其中整数的compare地址是0x40100f,而double的地址是0x0040100a。这说明编译器在编译的时候帮我们同时生成了两个compare函数。所以说,模板类的本质就是在编译器增加判断处理工作的同时,减少手工的重复劳动。同时和模板类不一样,模板函数不需要显示定义函数的参数类型,这是因为可以从入参判断出函数的类型。