zoukankan      html  css  js  c++  java
  • C++ | class size

    c++类大小和机器还有编译器有关。64位机器指针大小为8个字节,32位机器为4个字节。

    1. 每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址;
    2. 有虚函数的类有个virtual table(虚函数表),里面包含了类的所有虚函数,类中有个virtual table pointers,通常成为vptr指向这个virtual table;
    3. 有多个父类的,会维护多个虚函数指针,第一个指向第一个基类的虚函数表(并且带上在类中定义的虚函数),第二个指针指向第二个基类的虚函数表...以此类推。
    4. 虚继承,还有一个指向父类的指针,该指针为指向虚基类的指针(Pointer to virtual base class);
     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 class A {};
     6 
     7 class B {};
     8 
     9 class C : public A {
    10     virtual void func() = 0;
    11 };
    12 
    13 class D : public B, public C {};
    14 
    15 class E {
    16 public:
    17     virtual void e() {};    
    18 private:
    19     char abc[3];
    20 };
    21 
    22 class F : public E {
    23 public:
    24     virtual void f() {};
    25 };
    26 
    27 class G : virtual public E {};
    28 
    29 class H {
    30 public:
    31     virtual void h() {};
    32 private:
    33     char abc[3];
    34 };
    35 
    36 class I : public E, public H {};
    37 
    38 class J : virtual public E {};
    39 
    40 class K : public G, public J {};
    41 
    42 class L {
    43     static int l;
    44     static void la() { static int m; }
    45 };
    46 
    47 int main() {
    48     cout << "sizeof(A) = " << sizeof(A) << endl; // 空类,大小为1
    49     cout << "sizeof(B) = " << sizeof(B) << endl; // 空类,大小为1
    50     cout << "sizeof(C) = " << sizeof(C) << endl; // 虚函数表指针 (64位机器指针为8个字节)
    51     cout << "sizeof(D) = " << sizeof(D) << endl; // 虚函数表指针
    52     cout << "sizeof(E) = " << sizeof(E) << endl; // 字节对齐+虚函数表指针(8 + 8)
    53     cout << "sizeof(F) = " << sizeof(F) << endl; // 同E
    54     cout << "sizeof(G) = " << sizeof(G) << endl; // 虚继承,还包含一个父类的指针,所以是父类指针 + 虚函数表指针 + 字节对齐 = 24
    55     cout << "sizeof(H) = " << sizeof(H) << endl; // 同E
    56     cout << "sizeof(I) = " << sizeof(I) << endl; // 两个虚函数指针分别指向E和H + 两个数组字节对齐 = 32
    57     cout << "sizeof(J) = " << sizeof(J) << endl; // 同G
    58     cout << "sizeof(K) = " << sizeof(K) << endl; // 一个指向父类(E)的指针 + 两个虚函数指针分别指向G和J + 一个字节对齐 = 32
    59     cout << "sizeof(L) = " << sizeof(L) << endl; // 静态变量不占空间
    60     return 0;
    61 }

    输出:

     1 sizeof(A) = 1
     2 sizeof(B) = 1
     3 sizeof(C) = 8
     4 sizeof(D) = 8
     5 sizeof(E) = 16
     6 sizeof(F) = 16
     7 sizeof(G) = 24
     8 sizeof(H) = 16
     9 sizeof(I) = 32
    10 sizeof(J) = 24
    11 sizeof(K) = 32
    12 sizeof(L) = 1
  • 相关阅读:
    【Shell脚本学习18】Shell for循环
    【Shell脚本学习17】Shell case esac语句
    【Shell脚本学习16】Shell if else语句
    【Android车载系统 News | Tech 4】知乎--车载话题链接
    【Android车载系统 News | Tech 3】News 从手机征战到汽车 Android Auto对比CarPlay 2014-12-29
    【Android车载系统 News | Tech 2】News 谷歌开发新车载系统!安卓Auto不是终点 2014-12-20
    【Android车载系统 News | Tech 1】News 谷歌开发车载Android系统 2014-12-19
    【Mood-12】Android开发相关书籍推荐
    【Java/Android性能优3】Android性能调优工具TraceView使用介绍
    【Java/Android性能优2】Android性能调优工具TraceView介绍
  • 原文地址:https://www.cnblogs.com/linyx/p/3897617.html
Copyright © 2011-2022 走看看