【C++】 类对象的内存分布

        近期学习C++关于多态和虚函数相关的内容,了解到虚函数与普通成员函数的存储在类中并不相同。因此网上查找了相关内容,作总结记录如下:

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;
}

内存对齐的作用,主要就是为了处理器更有效地访问内存具体实现可以查找相关文章了解。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值