C++中,如果类中有多个成员变量,对象的内存是如何布局的?

   // 如果类中有多个成员变量,对象的内存是如何布局的?
                        地址值           内存数据
                                       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
   
   // 访问对象成员直接用点语法,指针必须用->来调用对象的成员变量

   }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值