• c++类大小问题


    1.空类

    class A
    {
    };
    
    sizeof(A); //1

    解析:类的实例化就是为每个实例在内存中分配一块地址;每个类在内存中都有唯一的标识,因此空类被实例化时,编译器会隐含地为其添加一个字节,以作区分。

    2.虚函数类

    class A
    {
        virtual void Fun();
    };
    
    sizeof(A); //4

    解析:当一个类中包含虚函数时,会有一个指向其虚函数表的指针vptr,系统为类指针分配大小为4个字节(即使有多个虚函数)。

    3.普通数据成员

    class A
    {
        int a;
        char b;
    };
    
    sizeof(A); //8

    解析:普通数据成员,按照其数据类型分配大小,由于字节对齐,所以a+b=8字节。

    4.静态数据成员

    class A
    {
        int a;
        static int b;
    };
    
    sizeof(A); //4

    解析:静态数据成员存放的是全局数据段,即使它是类的一个成员,但不影响类的大小;不管类产生多少实例或者派生多少子类,静态成员数据在类中永远只有一个实体存在。而类的非静态数据成员只有被实例化时,才存在,但类的静态数据成员一旦被声明,无论类是否被实例化,它都已存在,类的静态数据成员可以说是一种特殊的全局变量。

    5.普通成员函数

    class A
    {
        void Fun();
    };
    
    sizeof(A); //1

    解析:类的大小与它的构造函数、析构函数以及其他成员函数无关,只与它的数据成员相关。

    6.普通继承

    class A
    {
        int a;
    };
    
    class B:public A
    {
        int b;
    };
    
    sizeof(B); //8

    解析:普通类的继承,类的大小为本身数据成员大小+基类数据成员大小。

    7.虚函数继承

    virtual class A
    {
        int a;
    };
    
    class B:virtual public A
    {
        int b;
    };
    
    sizeof(B); //12

    解析:虚函数类的继承,派生类大小=派生类自身成员大小+基类数据成员大小+虚拟指针大小(即使继承多个虚基类,也只有一个指向其虚函数表的指针vptr,大小为4字节)。

  • 相关阅读:
    [转]ubuntu的which、whereis、locate和find命令
    [转]理解SSL(https)中的对称加密与非对称加密
    SSL交互过程
    [转]程序开发基础学习二(C++ Google Style 命名规则)
    函数内动态分配内存
    sizeof和strlen
    Sublime Text 3 安装Package Control
    [转]使用Openssl的AES加密算法
    正则表达式
    论文书写常见问题与技巧
  • 原文地址:https://www.cnblogs.com/sz-leez/p/7119232.html
Copyright © 2020-2023  润新知