使用对象直接访问成员与使用指针间接访问成员的差别
查看代码
#include <iostream>
using namespace std;
struct Person {
int age;
int id;
int height;
void run() {
cout << "person::run()" << age << endl;
}
};
int main()
{
//使用对象直接访问成员
Person person;
person.age = 11;
person.id = 10;
person.height = 9;
person.run();
//使用指针间接访问成员
Person* p = &person;
p->age = 8;
p->id = 7;
p->height = 6;
p->run();
getchar();
return 0;
}
查看其反汇编结果
23: //使用对象直接访问成员
24: Person person;
25: person.age = 11;
00BA5E42 mov dword ptr [ebp-14h],0Bh
26: person.id = 10;
00BA5E49 mov dword ptr [ebp-10h],0Ah
27: person.height = 9;
00BA5E50 mov dword ptr [ebp-0Ch],9
28: person.run();
00BA5E57 lea ecx,[ebp-14h]
00BA5E5A call 00BA1442
29:
30: //使用指针间接访问成员;
从指针中取出对象的地址;
利用对象的地址+成员变量的偏移量计算出成员变量的地址;
根据成员变量的地址访问成员变量的存储空间
31:
32: Person* p = &person;
00BA5E5F lea eax,[ebp-14h]
00BA5E62 mov dword ptr [ebp-20h],eax
33: p->age = 8;
00BA5E65 mov eax,dword ptr [ebp-20h]
00BA5E68 mov dword ptr [eax],8
34: p->id = 7;
00BA5E6E mov eax,dword ptr [ebp-20h]
00BA5E71 mov dword ptr [eax+4],7
35: p->height = 6;
00BA5E78 mov eax,dword ptr [ebp-20h]
00BA5E7B mov dword ptr [eax+8],6
36: p->run();
00BA5E82 mov ecx,dword ptr [ebp-20h]
00BA5E85 call 00BA1442
查看代码
#include <iostream>
using namespace std;
struct Person {
int age;
int id;
int height;
void run() {
cout << "age =" << age << ",id =" << id << ",height =" << height << endl;
}
};
int main()
{
//使用对象直接访问成员
Person person;
person.age = 11;
person.id = 10;
person.height = 9;
person.run();
//使用指针间接访问成员
/*Person* p = &person;
p->age = 8;
p->id = 7;
p->height = 6;
p->run();*/
//指针的思考
Person* p = (Person*)&person.id;
p->age = 8;
p->id = 7;
p->run(); //因为会将指针p里面存储的地址(&person.id)传递给run函数的this
person.run(); //会将person对象的地址传递给run函数的this
getchar();
return 0;
}
反汇编结果
15: //使用对象直接访问成员
16: Person person;
17: person.age = 11;
00185E42 mov dword ptr [ebp-14h],0Bh
18: person.id = 10;
00185E49 mov dword ptr [ebp-10h],0Ah
19: person.height = 9;
00185E50 mov dword ptr [ebp-0Ch],9
20: person.run();
00185E57 lea ecx,[ebp-14h]
00185E5A call 00181442
21:
22: //使用指针间接访问成员
23:
24: /*Person* p = &person;
25: p->age = 8;
26: p->id = 7;
27: p->height = 6;
28: p->run();*/
29:
30: //指针的思考
31: Person* p = (Person*)&person.id;
00185E5F lea eax,[ebp-10h]
00185E62 mov dword ptr [ebp-20h],eax
32: p->age = 8;
00185E65 mov eax,dword ptr [ebp-20h]
00185E68 mov dword ptr [eax],8
33: p->id = 7;
00185E6E mov eax,dword ptr [ebp-20h]
00185E71 mov dword ptr [eax+4],7
34: p->run(); //因为会将指针p里面存储的地址(&person.id)传递给run函数的this
00185E78 mov ecx,dword ptr [ebp-20h]
00185E7B call 00181442
35: person.run(); //会将person对象的地址传递给run函数的this
00185E80 lea ecx,[ebp-14h]
00185E83 call 00181442
out为
age =11,id =10,height =9
age =8,id =7,height =-858993460
age =11,id =8,height =7
发生此种现象的原因是:函数里的栈空间全是CCCCCCCCCCC,即一大堆int3,全是断点