// 如果类中有多个成员变量,对象的内存是如何布局的?
地址值 内存数据
12个字节
&person.m_id &person 005DF7A0
005DF7A1 m_id = 1
005DF7A2
005DF7A3
&person.m_age 005DF7A4
005DF7A5 m_age = 2
005DF7A6
005DF7A7
&person.m_height 005DF7A8
005DF7A9 m_height = 3
005DF7AA
005DF7AB
struct Person {
int m_id; //4个字节
int m_age;
int m_height;
void display() {
}
};
int main() {
Person person;
person.m_id = 1;
person.m_age = 2;
person.m_height = 3;
cout << &person << endl; //打印结果为: 005DF7A0
cout << &person.m_id << endl; //打印结果为: 005DF7A0
cout << &person.m_age << endl; //打印结果为: 005DF7A4
cout << &person.m_height << endl;//打印结果为: 005DF7A8
cout << sizeof(person) << endl; //打印结果为: 12
// 总结:一个变量的地址值是所有字节中中最小字节
}
例二:指针指向对象成员变量,汇编语言是如何访问的
struct Person {
int m_id; //4个字节
int m_age;
int m_height;
void display() {
}
};
int main() {
Person person;
person.m_id = 1;
person.m_age = 2;
person.m_height = 3;
cout << &person << endl; //打印结果为: 005DF7A0
cout << &person.m_id << endl; //打印结果为: 005DF7A0
cout << &person.m_age << endl; //打印结果为: 005DF7A4
cout << &person.m_height << endl;//打印结果为: 005DF7A8
cout << sizeof(person) << endl; //打印结果为: 12
// 总结:一个变量的地址值是所有字节中中最小字节
Person *pPerson = &person;
pPerson->m_id = 4;
pPerson->m_age = 4;
pPerson->m_height = 4;
mov dword ptr [ebp-14h],1
mov dword ptr [ebp-10h],2
mov dword ptr [ebp-0Ch],3
// ebp-14h == &person
lea eax,[ebp-14h]
mov dword ptr [ebp-20h],eax
// ebp-20h指的是指针的地址值,这两句代码的意思是将person对象的地址值赋值给ebp-20h这个指针的存储空间中,
ebp-20h == &pPerson
mov eax,dword ptr [ebp-20h]
// 取出指针变量pPerson中存储的内容记person对象的地址值,把person对象的地址值给了eax寄存器
mov dword ptr [eax],4
// eax里面放的是person对象的地址值,其实放的就是m_id的地址值,就是将4赋值给m_id
mov eax,dword ptr [ebp-20h]
// 同上,将指针里面存储的东西,赋值给eax,eax依然是放着person对象的地址值,
mov dword ptr [eax+4],5
// 将person对象的地址值+4,默认是age的地址值,所以讲5赋值给m_age, 下面同理就不说了
mov eax,dword ptr [ebp-20h]
mov dword ptr [eax+8],6
// 访问对象成员直接用点语法,指针必须用->来调用对象的成员变量
}
C++中,如果类中有多个成员变量,对象的内存是如何布局的?
最新推荐文章于 2022-05-09 20:51:21 发布