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.

  • 相关阅读:
    微软程序员最好的时代来了
    领域驱动设计系列 (六):CQRS
    当我谈 "加班有罪" 我在谈什么?
    parquet 简介(转)
    Spark动态资源分配-Dynamic Resource Allocation
    Spark配置参数详解
    PhpStorm使用sftp实现代码自动上传服务器
    docker 命令大全
    mysql 5.6配置
    docker volume
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3327323.html
Copyright © 2011-2022 走看看