zoukankan      html  css  js  c++  java
  • c++类占内存空间大小计算

    x64环境下实现:

      1 #include <iostream>
      2 
      3 using namespace std;
      4 
      5 class kong{
      6 
      7 };
      8 
      9 class kong1{
     10 
     11 };
     12 
     13 class kong2{
     14 
     15 };
     16 
     17 class data2
     18 {
     19     int a;    //4个字节
     20     char s;
     21 };
     22 
     23 class data3
     24 {
     25     int a;
     26     char s;
     27     virtual void kong();      //在64位系统分配指针大小为8字节
     28     virtual void kong1();
     29 };
     30 
     31 class data4 : public data3
     32 {
     33     
     34 };
     35 
     36 class data5 : virtual public data3
     37 {
     38 
     39 };
     40 
     41 class data6 : public data3
     42 {
     43     virtual void kong();
     44 };
     45 
     46 class data7 : virtual public data3
     47 {
     48     virtual void kong();
     49 };
     50 
     51 class data8 : public data2
     52 {
     53     virtual void kong();
     54 };
     55 
     56 class data9 : public data2
     57 {
     58     
     59 };
     60 
     61 class data10 : virtual public data2
     62 {
     63     virtual void kong();
     64 };
     65 
     66 class data11 : virtual public data2
     67 {
     68     
     69 };
     70 
     71 int main()
     72 {
     73     //c++要求每个实例在内存中都有独一无二的地址。空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以空类的sizeof为1
     74     kong ko;
     75     cout << sizeof(ko) << " " << sizeof(kong) << endl;
     76 
     77     //包含了对齐,64位int型4个字节
     78     data2 da;
     79     cout << sizeof(da) << " " << sizeof(data2) << endl;
     80 
     81     //C++ 类中有虚函数的时候有一个指向虚函数的指针(vptr),在32位系统分配指针大小为4字节,在64位系统分配指针大小为8字节。无论多少个虚函数,只有这一个指针,8字节
     82     cout << sizeof(data3) << endl;
     83 
     84     //data3类(包含virtual),data4(不包含virtual)直接继承data3 输出为16, C++ 类中有虚函数的时候有一个指向虚函数的指针(vptr),在64位系统分配指针大小为8字节。无论多少个虚
     85     //函数,只有这一个指针,8字节。并且子类的大小是本身成员变量的大小加上父类的大小。 父类16 子类0
     86     cout << sizeof(data4) << endl;
     87 
     88     //若data5(不包含virtual)虚继承data3, 输出为24, 父类16加上子类的virtual(8),指针8
     89     cout << sizeof(data5) << endl;
     90 
     91     //data3类(包含virtual),data6(包含virtual)直接继承data3 输出为16, 原因:如果子类直接继承父类,他们是共享一个虚函数指针
     92     cout << sizeof(data6) << endl;
     93 
     94     //若是data7(包含virtual)虚继承data3,输出为24, 父类16,子类虚函数指针8 输出24
     95     cout << sizeof(data7) << endl;
     96 
     97     //data2类(不包含virtual),data8(包含virtual)直接继承 输出为16, 父类为8 子类虚函数指针8 输出为16
     98     cout << sizeof(data8) << endl;
     99 
    100     //若data9(不包含virtual)直接继承data2类(不包含virtual),输出为8, 父类8 子类0 输出8
    101     cout << sizeof(data9) << endl;
    102 
    103     //data10(包含virtual)虚继承data2类(不包含virtual), 输出为 24, 父类为8 ,虚基类指针为8,子类虚函数指针8 输出为24
    104     cout << sizeof(data10) << endl;
    105 
    106     //data11(不包含virtual)虚继承data2类(不包含virtual), 输出为 16, 父类为8 ,虚基类指针为8, 输出为16
    107     cout << sizeof(data11) << endl;
    108 
    109 
    110     //如果有多个virtual函数,只有一个指针
    111     //若子类虚继承,则子类有自己的一个虚函数指针
    112     //子类直接继承父类,若父中由virtual,则父子共享一个指针用来指定虚函数的虚拟函数表的入口地址
    113 
    114     return 0;
    115 }

    结果(单位:字节):

  • 相关阅读:
    用js实现一个简单的mvvm
    ~~~持续更新,面向对象的编程,个人浅见
    前端直播功能开发总结
    echarts饼图去除鼠标移入高亮
    外包项目的感悟
    white-space:pre-wrap和word-break:break-all;
    转行两年,工作一年年,谈谈浅见
    html2canvas
    js点滴
    常用工具链接
  • 原文地址:https://www.cnblogs.com/Jace-Lee/p/5869220.html
Copyright © 2011-2022 走看看