近期学习C++关于多态和虚函数相关的内容,了解到虚函数与普通成员函数的存储在类中并不相同。因此网上查找了相关内容,作总结记录如下:
C++ 类的内存分布
【对象内存】内存上,虽然每个对象都有自己独立的成员变量,但彼此共享成员函数,这样可以节省内存空间,并使多个对象能够共享相同的行为。
派生类会继承基类的成员变量和成员函数,但成员变量在对象的内存中是分开存储的。
实际内存分布
虚函数表指针* -> 非静态数据成员1 -> 非静态数据成员2 . . .
类的内容 | 占用内存 |
---|---|
成员函数 | 不占用类实例内存,只保存一份所有对象共享的代码 |
虚函数 | 占用类内存,虚函数表指针占用类内存的首部 |
非静态数据成员 | 占用类实例内存,紧跟虚函数表指针后 |
上述内存分布都遵循内存对齐原则(class 和 struct):
内存对齐原则,很关键!!
1、内存分配按照类中声明的顺序进行;
2、当前成员变量相对于起始位置的偏移量应是该变量类型占用字节大小的整数倍,否则要空出一定量的内存后再进行存储;
3、整个类的内存空间大小必须是里面变量类型大小最大值的整数倍;
例如:1. 类中依次声明char(1字节)/int(4字节)/double(8字节),内存分布如下:
1 x x x 2 2 2 2 3 3 3 3 3 3 3 3 总共占16字节
2. 依次声明double/int/char,内存分布如下:
1 1 1 1 1 1 1 1 2 2 2 2 1 x x x 共占16字节
3. 依次声明char/double/int,内存分布如下:
1 x x x x x x x 2 2 2 2 2 2 2 2 3 3 3 3 x x x x 共占24字节
#include <iostream>
using namespace std;
class A {
char a;
int b;
double c;
};
class B {
double a;
int b;
char c;
};
class C {
char a;
double b;
int c;
};
int main() {
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
cout << sizeof(C) << endl;
}
内存对齐的作用,主要就是为了处理器更有效地访问内存具体实现可以查找相关文章了解。