C++随记: 内存对齐的作用及用法

1.什么是内存对齐

    内存对齐指的是编译器将每个“数据单元”安排在字的整数倍指向的内存中,即要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数。

2.为什么要使用内存对齐

  原因:

  • 某些硬件设备只能存取对齐数据,存取非对齐数据可能会发生异常;
  • 某些硬件设备不能保证在存取非对齐数据的时候的操作是原子操作;
  • 存取对齐的数据,要比存取非对齐的数据更快一些;
  • 某些处理器虽然支持非对齐数据的访问,但会引发对齐陷阱;
  • 某些硬件设备只支持简单数据指令非对齐存取,不支持复杂数据指令的非对齐存取

 优点:

  • 便于在不同平台之间移植,一些硬件平台不支持任意地址的访问
  • 提高内存的访问效率,在CPU读取内存时,一块一块的读取

3.如何进行内存对齐 

  我们举个例子来介绍内存对齐的原理:

 下面引用一张老图

  1. 我们都知道int类型的值在C++中占4字节,char类型占1字节,此例中我们存取整数倍数设置为4字节
  2. 首先存入c1,占1字节,填入
  3. 再对i存入,由于前面c1占用了1字节,整数倍内存为4字节,剩余空间只剩3字节,故i从5开始存取,占4字节
  4. 存入c2,由于i的结束位置为8,是4的整数倍,故c2从9开始进行存入,占一字节

  由此可以看出此例中三个变量,共占内存为12字节

4.实例 

  代码:

#include <iostream>
using namespace std;
class a {
public:
	char c1;//从1开始存入,占1字节
	int i;//从5开始存入,占4字节
	char c2;//从9开始存入,占1字节
};
class b {
public:
	char c3;//从1开始存入,占1字节
	char c4;//从2开始存入,占1字节
	int j;//从5开始存入,占4字节
};
int main() {
	a res1;
	b res2;
	cout << "类a占用内存:" << sizeof(res1) << "字节" << endl;
	cout << "类b占用内存:" << sizeof(res2) << "字节" << endl;
}

 输出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值