不同类型的class的长度

在计算机中,一个数据类型是有固定的长度的,例如:int、float和double等基本类型的变量,但是一个类在计算机中占据多少内存空间呢?

使用sizeof运算符可以获取一个数据的长度,我们可以使用该运算符可以计算出class的长度以及其不同状态下所占据的空间大小

不同类的定义以及其长度获取代码如下:

#include <iostream>
using namespace std;

class test{
    int data;
    double d;
};

class empty{};

class test0{

	static int data;
};

class test1{
    void fun1(){
        cout << "This is the fun1" << endl;
    }
    void fun2(){
        cout << "This is the fun2" << endl;
    }
};

class test2{
    void show(){
        cout << "Hello world!" << endl;
    }
};

class Virtual{
    virtual void fun(){};
};

int main()
{
    cout << "The test size is: " << sizeof(test) << endl;
    cout << "The empty size is: " << sizeof(empty) << endl;
	cout << "The test0 size is " << sizeof(test0) << endl;
	cout << "The test1 size is: " << sizeof(test1) << endl;
    cout << "The test2 size is: " << sizeof(test2) << endl;
    cout << "The Virtual size is: " << sizeof(Virtual) << endl;
    return 0;
}

程序运行结果如下:

The test size is: 16
The empty size is: 1
The test0 size is 1
The test1 size is: 1
The test2 size is: 1
The Virtual size is: 8

根据程序运行结果我们可以得出以下结论:

  1. 即使一个类未定义任何数据成员,它也占一个字节

  2. 一个类的成员函数不占用类的空间,即使其拥有大量的成员函数

  3. 一个类的静态成员变量不占用类的空间

  4. 如果一个类中包含虚函数,那么编译器会为其分配指向虚函数表的指针,其最小长度为8

  5. 一个类的长度并不是其中成员变量的类型长度之和,而是牵扯到内存对齐的问题

内存对齐

内存对齐有三个基本原则:

  1. 第一个数据从0开始,以后每个数据要从他本身大小的整数倍开始存
  2. 如果这个数据是个结构体或者数组,则从其最大元素的整数倍开始存
  3. 最后收尾要是最大成员的整数倍,不足补齐

以下列代码为例,数据data从03开始存放,而double则要从415存放,为满足第三个原则,内存对其为16

class test{
    int data;
    double d;	//4~12 + 12~15
};