• 空类


    1.empty class:意味着对象不使用任何空间,因为没有任何隶属对象的数据需要存储.(即类不包含任何non-static成员变量,没有virtual函数,没有virtual base),但c++规定独立(非附属)对象必须有非零大小。

    1 class a{};
    2 int main()
    3 {
    4     a a;
    5     cout << sizeof(a) << endl;
    6 }

     1 class a
     2 {
     3 };
     4 
     5 class b:a
     6 {
     7     int bb;
     8     a aa;   
     9 };
    10 int main()
    11 {
    12      b b;
    13     cout << sizeof(b) << endl;   //sizeof(bb)=4,sizeof(aa)=1,内存对齐后为8
    14 }

    2.static 变量存储在全局/静态存储区,被所有对象共享,不占用对象的存储空间

     1 class a
     2 {
     3     static int i;
     4     static int j;
     5 };
     6 int main()
     7 {
     8     a a;
     9     cout << sizeof(a) << endl;
    10 }

    3.包含虚函数的类,对象会包含一个vptr(虚函数表指针)

     1 class a
     2 {
     3 public:
     4     virtual void fun1(){}
     5     virtual void fun2(){}
     6 };
     7 int main()
     8 {
     9     a a;
    10     cout << sizeof(a) << endl;   //vptr大小,指针为4
    11 }

    4.不能包含虚基类,包含虚基类的对象也包含一个指针

     1 class a
     2 {
     3     int aa;
     4 };
     5 
     6 class b :virtual public a
     7 {
     8     int bb;
     9 };
    10 int main()
    11 {
    12      b b;
    13     cout << sizeof(b) << endl;   //sizeof(a::aa)+sizeof(b::bb)+sizeof(指针)
    14 }

    5.空白基类最优化(EBO):在单一继承里,基类为空类,则派生类从基类继承而来的部分不占内存(注意区别1.中的第二种情况)

     1 class a
     2 {};
     3 
     4 class b:a
     5 {
     6     int bb;
     7 };
     8 int main()
     9 {
    10      b b;
    11     cout << sizeof(b) << endl;
    12 }

    但在多继承里,EBO不成立

    class a {};
    class aa{};
    class b:a,aa
    {
        int bb;
    };
    int main()
    {
         b b;
         cout << sizeof(b) << endl;   //sizeof(bb)+a的大小+aa的大小
    }

  • 相关阅读:
    MR 原理
    Hadoop yarn任务调度策略介绍
    Hadoop 新 MapReduce 框架 Yarn 详解
    Hadoop 架构与原理
    Linux-top命令详解
    硬中断与软中断的区别
    Protocol_BGP
    Protocol_ISIS
    20条Linux命令面试问答
    Protocol_OSPF
  • 原文地址:https://www.cnblogs.com/mrlsx/p/5869306.html
Copyright © 2020-2023  润新知