• 对象所占内存的大小与首地址


     1 #include "stdafx.h"
     2 #include "iostream"
     3 
     4 using namespace std;
     5 
     6 class stu
     7 {
     8 private:
     9     int Id;
    10     int Age;
    11     int Tall;
    12     int Sex;
    13 public:
    14     void setID(int a);
    15     void setAge(int a);
    16     void setTall(int a);
    17     int getId();
    18     int getAge();
    19     int getTall();
    20     void IP()
    21     {
    22         cout << this << endl;
    23     }
    24 };
    25 
    26 void stu::setID(int a)
    27 {
    28     Id = a;
    29 }
    30 void stu::setAge(int a)
    31 {
    32     Age = a;
    33 }
    34 void stu::setTall(int a)
    35 {
    36     Tall = a;
    37 }
    38 int stu::getId()
    39 {
    40     return Id;
    41 }
    42 int stu::getAge()
    43 {
    44     return Age;
    45 }
    46 int stu::getTall()
    47 {
    48     return Tall;
    49 }
    50 
    51 
    52 int main(int argc, char* argv[])
    53 {
    54     stu liu;                //用类stu定义一个名为liu的对象.
    55     liu.setID(2);            //从这个函数的的反汇编得出里面的ECX=0018FF38
    56     liu.IP();                //这个函数里面打印了this的值,也是0018FF38
    57     cout << &liu << endl ;    //打印的结果是0018FF38
    58     return 0;
    59 }
    60 /*
    61 结论:
    62 *********************************************************************
    63 1.this指针指向的是当前对象"首地址".
    64 2.对象里面的函数成员的函数框架里面ECX存放的就是当前对象的"首地址".
    65 3.用 &liu 这样的方法也可以得出当前对象的首地址.
    66 */
    67 
    68 
    69 
    70 /*
    71 反汇编分析
    72 50:   {
    73 00401400   push        ebp
    74 00401401   mov         ebp,esp
    75 00401403   sub         esp,50h
    76 00401406   push        ebx
    77 00401407   push        esi
    78 00401408   push        edi
    79 00401409   lea         edi,[ebp-50h]
    80 0040140C   mov         ecx,14h
    81 00401411   mov         eax,0CCCCCCCCh
    82 00401416   rep stos    dword ptr [edi]
    83 51:       stu liu;    //反汇编时,如果在这里下了断点,调试时调试箭头会移动到 return 0 这里.
    84 52:                    //因为stu liu 只是定义了一个对象,没有具体进行操作.    
    85 53:       return 0;
    86 00401418   xor         eax,eax
    87 54:   }
    88 0040141A   pop         edi
    89 0040141B   pop         esi
    90 0040141C   pop         ebx
    91 0040141D   mov         esp,ebp
    92 0040141F   pop         ebp
    93 00401420   ret
    94 //从  sub   esp,50h 来看,因为是定义了对象liu ,所以多了10h的内存空间.
    95 //在类里面有4个int 变量和6个函数.可以看出,类的数据成员是会向调用函数申请空间的,
    96 //而函数成员是不会向调用函数申请占内存的.
    97 */
  • 相关阅读:
    【转】 springBoot(5)---单元测试,全局异常
    【转】 springBoot(4)---热部署,配置文件使用
    【转】 springBoot(3)---目录结构,文件上传
    【转】 springBoot(2)---快速创建项目,初解jackson
    【转】 springBoot(1)---springboot初步理解
    【转】 SpringBoot+MyBatis+MySQL读写分离
    简单请求 vs 非简单请求
    H5新增的API
    图片
    vue更新dom的diff算法
  • 原文地址:https://www.cnblogs.com/adalovelace/p/4019491.html
Copyright © 2020-2023  润新知