• class类的sizeof计算


    class no_virtual
    {
    public:
          void fun1() const{}
          int    fun2() const { return a; }
    private:
          int a;
    }
    
    class one_virtual
    {
    public:
          virtual void fun1() const{}
          int    fun2() const { return a; }
    private:
          int a;
    }
    
    class two_virtual
    {
    public:
          virtual void fun1() const{}
          virtual int    fun2() const { return a; }
    private:
          int a;
    }
    

    以上三个类中:
    no_virtual没有虚函数,sizeof(no_virtual)=4,类no_virtual的长度就是其成员变量整型a的长度;
    one_virtual有一个虚函数,sizeof(one_virtual)=8;
    two_virtual有两个虚函数,sizeof(two_virtual)=8; 有一个虚函数和两个虚函数的类的长度没有区别,其实它们的长度就是no_virtual的长度加一个void指针的长度,它反映出,如果有一个或多个虚函数,编译器在这个结构中插入一个指针( V P T R)。在one_virtual 和two_virtual之间没有区别。这是因为V P T R指向一个存放地址的表,只需要一个指针,因为所有虚函数地址都包含在这个表中。

    关于 如何sizeof(类)
    空类
    :1
    没有虚函数:sizeof(数据成员)的和
    有虚函数:sizeof(数据成员)的和+sizeof(V表指针)=4

    2、若类中包含成员,则类对象的大小只包括其中非静态成员经过对齐所占的空间,对齐方式和结构体相同。如:

    class A
    {
    public:
    int b;
    float c;
    char d;
    };

    sizeof(A)是12.

    class A
    {
    public:
    static int a;
    int b;
    float c;
    char d;
    };
    sizeof(A)是12.

    class A
    {
    public:
    static int a;
    int b;
    float c;
    char d;
    int add(int x,int y)
    {
    return x+y;
    }
    };
    sizeof(A)也是12.

  • 相关阅读:
    怎么获取数组中的对象的某一项之和
    原型链
    js的事件循环(Eventloop) 机制/js的宏任务微任务执行顺序
    怎么替换数组中对象的属性
    求对象所有值的和
    sequelize中duplicating:false的使用
    WebSocket
    轮播

    ssl tsl
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3327323.html
Copyright © 2020-2023  润新知