首页 > 代码库 > 对象所占内存的大小与首地址

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

 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=0018FF3856     liu.IP();                //这个函数里面打印了this的值,也是0018FF3857     cout << &liu << endl ;    //打印的结果是0018FF3858     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        ebp74 00401401   mov         ebp,esp75 00401403   sub         esp,50h76 00401406   push        ebx77 00401407   push        esi78 00401408   push        edi79 00401409   lea         edi,[ebp-50h]80 0040140C   mov         ecx,14h81 00401411   mov         eax,0CCCCCCCCh82 00401416   rep stos    dword ptr [edi]83 51:       stu liu;    //反汇编时,如果在这里下了断点,调试时调试箭头会移动到 return 0 这里.84 52:                    //因为stu liu 只是定义了一个对象,没有具体进行操作.    85 53:       return 0;86 00401418   xor         eax,eax87 54:   }88 0040141A   pop         edi89 0040141B   pop         esi90 0040141C   pop         ebx91 0040141D   mov         esp,ebp92 0040141F   pop         ebp93 00401420   ret94 //从  sub   esp,50h 来看,因为是定义了对象liu ,所以多了10h的内存空间.95 //在类里面有4个int 变量和6个函数.可以看出,类的数据成员是会向调用函数申请空间的,96 //而函数成员是不会向调用函数申请占内存的.97 */

 

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