内存对齐的探索

内存对齐

内存对齐为了解决什么问题?

CPU取地址并不是一个字节一个字节的取。

是一次性取多个字节。如果一个变量放在两个CPU取的块中,那么就会造成多一次的读取。

变量所占的字节数

64位的系统中

bool char 1字节

int 4字节

指针8字节

short 2字节

内存对齐的要求

每个变量的偏移地址为字节数的倍数。

如下所示b为1字节,a为4字节,但是a如果紧接在b的后面偏移地址为1.

所以b后面得添加3个字节,变成4字节。4+4=8。

struct mystruct
{
	bool b;
	int a;
}

结构体中有函数的情况:

本以为是多个虚函数都只有一个指针指向虚函数列表,非虚函数则有多少个就有多少个8字节。

但是经过实验使用sizeof()发现,不管怎么样增加非虚函数,都没有内存空间大小的增加。仔细想想后得出下面的结论:

首先函数的存储是不在对象里面的,而是多个对象共享的。因此非虚函数在对象中不存在。

如果有虚函数,考虑到每个类有一个虚函数指针指向虚函数列表。

所以会有一个8字节的空间,无论多少个虚函数都是8字节。

因此下面占用的空间数是4+4+8

struct mystruct
{
	bool b;
	int a;
	int func(int c){};
	void* func3(int d) {};
	virtual void func1(){};
	virtual void func2() {};
	
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值