不同类型的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
根据程序运行结果我们可以得出以下结论:
-
即使一个类未定义任何数据成员,它也占一个字节
-
一个类的成员函数不占用类的空间,即使其拥有大量的成员函数
-
一个类的静态成员变量不占用类的空间
-
如果一个类中包含虚函数,那么编译器会为其分配指向虚函数表的指针,其最小长度为8
-
一个类的长度并不是其中成员变量的类型长度之和,而是牵扯到内存对齐的问题
内存对齐
内存对齐有三个基本原则:
- 第一个数据从0开始,以后每个数据要从他本身大小的整数倍开始存
- 如果这个数据是个结构体或者数组,则从其最大元素的整数倍开始存
- 最后收尾要是最大成员的整数倍,不足补齐
以下列代码为例,数据data从03开始存放,而double则要从415存放,为满足第三个原则,内存对其为16
class test{
int data;
double d; //4~12 + 12~15
};