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

 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 */
原文地址:https://www.cnblogs.com/adalovelace/p/4019491.html