zoukankan      html  css  js  c++  java
  • C++对象模型

    C++对象模型内存布局例如以下:
    • 非静态数据成员在对象之内
    • 静态数据成员在对象之外
    • 静态、非静态成员函数在对象之外
    • 类中存在虚函数时,一个类相应一个virtual table放在对象之外,对象中安插一个指针vptr指向这个表。
    測试例程:
    #include <iostream>
     
    using namespace std;
     
    class A {
    public:
        int x, y;
        static int s;
        void f1() { }
        static void f2() { }
        virtual void f3() { }
    };
    int A::s = 123;
     
    int main()
    {
        cout << "size = " << sizeof(A);
        return 0;
    }
    

    执行结果:
    能够看出,对象所在内存中仅仅包括有整型变量x、y、vptr,其他成员所有存在于对象之外。

    以下讨论继承体系下的对象模型。以下这个測试例程有点意思:
    #include <iostream>
     
    using namespace std;
     
    class A {
    public:
        int x, y;
     
    };
     
    class B: public A {
    };
     
    class C: virtual public A {
    };
     
    int main()
    {
        cout << "class B size = " << sizeof(B) << endl;
        cout << "class C size = " << sizeof(C) << endl;
        return 0;
    }


    执行结果:


    类C採用了虚继承,内部就多了四字节。这是因为虚继承的特性决定的:在虚拟继承情况下,基类(虚基类)无论在继承链中被派生多少次,永远仅仅会存在一个实例。和virtual table类似,也存在一个指针表(virtual base class table),表中每一个指针指向一个虚基类地址,在对象中也安插一个指针指向这个表。所以类C才会添加了四字节空间。而在普通继承中,派生对象把基类对象包裹起来存放一块连续内存中,每一个类都有一份基类对象的实例。

    环境:
    Win7 + Code::Blocks

    參考:
    《深度探索C++对象模型》 P9-P13.
  • 相关阅读:
    rabbitmq在centos7下安装
    跨域问题
    11生成器相关及推导式(附内置函数分析图url)
    10函数名的应用,闭包,和迭代器
    09函数的动态传参及global和nonlocal关键字
    08函数简介
    07基本的文件操作
    06set集合和深浅拷贝(包括前面的一些知识点补充)
    05判断和编码/解码
    04基本数据类型(字典)
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3760473.html
Copyright © 2011-2022 走看看