zoukankan      html  css  js  c++  java
  • C++类的内存分布

    C++一般类的内存分布

    一下都是在x64下进行的编译

    1、空类

    2、无继承、无虚函数类

    3、无继承、有虚函数类

    4、有继承、有虚函数类

    C++继承类的内存分布

    C++多重继承时的内存分布

    #include <iostream>
    using namespace std;
    
    class A {
    public:
        int a;
    };
    
    class B1 :  public A {
    public:
        int b1;
    };
    
    class B2 :  public A {
    public:
        int b2;
    };
    
    class C : public B1, public B2 {
    public:
        int c1;
    };
    
    int main() {
        
        cout << "A_size=" << sizeof(A) << endl;
        cout << "B1_size=" << sizeof(B1) << endl;
        cout << "B2_size=" << sizeof(B2) << endl;
        cout << "C_size=" << sizeof(C) << endl;
        cout << "end..." << endl;
        system("pause");
        return 0;
    }

    类A、B1、B2的内存分布

    类C的内存分布

    C++类虚继承时的内存分布---->虚继承解决二义性的问题

    #include <iostream>
    using namespace std;
    
    class A {
    public:
        int a;
    };
    
    class B1 : virtual public A {
    public:
        int b1;
    };
    
    class B2 : virtual public A {
    public:
        int b2;
    };
    
    class C : public B1, public B2 {
    public:
        int c1;
    };
    
    int main() {
        C  c1;
        c1.b1 = 100;
        c1.b2 = 200;
        c1.c1 = 300;
    
        c1.a = 500; //虚继承使得成员变量a只有一份拷贝,通过虚指针可以确定地址
    
        cout << "A_size=" << sizeof(A) << endl;
        cout << "B1_size=" << sizeof(B1) << endl;
        cout << "B2_size=" << sizeof(B2) << endl;
        cout << "C_size=" << sizeof(C) << endl;
        cout << "end..." << endl;
        system("pause");
        return 0;
    }

    类A和B1的内存分布

    类B2的内存分布

    类C的内存分布

  • 相关阅读:
    线程(C++11)
    初始化、赋值
    优质学习资料总结
    移植之乱谈
    采集音频和摄像头视频并实时H264编码及AAC编码
    H264解码器源码(Android 1.6 版)
    移植ffmpeg到VC环境心得
    收集的网络上大型的开源图像处理软件代码(提供下载链接)
    C++开源库,欢迎补充。
    一个轻量级AOP的实现(开源)
  • 原文地址:https://www.cnblogs.com/-citywall123/p/13234215.html
Copyright © 2011-2022 走看看