zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    STL 源代码剖析 算法 stl_numeric.h -- copy
    SQLServer 复制和数据库镜像 具体配置部署
    2016第23周三
    2016第23周二
    2016第23周一
    2016第22周日
    2016第22周六
    2016第22周五
    五个JS经典面试题
    2016第22周三
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3327323.html
Copyright © 2011-2022 走看看