c/c++内存对齐

引用知乎答主KDF5000的一段话——内存对齐主要遵循下面三个原则:

  1. 结构体变量的起始地址能够被其最宽的成员大小整除
  2. 结构体每个成员相对于起始地址的偏移能够被其自身大小整除,如果不能则在前一个成员后面补充字节
  3. 结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节(其实编译器在编译的时候是可以指定对齐大小的,实际使用的有效对齐其实是取指定大小和自身大小的最小值,一般默认的对齐大小是4。)

举个例子:由于内存对齐,创建结构体的时候变量的书写顺序可能影响到结构体变量的大小

struct{
    int a;
    char b;
    short c;
}A;//sizeof(A) = 3*4 = 12,按照最大的成员int(4字节)对齐
struct{
	char b;
	short c;
	int a;
}B;//sizeof(B) = 8

可以理解成每4字节一个块,给变量分配的时候先看看这个能不能放到已经存在的块里,short是两个字节,char占用了第一个块的一个字节以后第一块还剩下三个字节,所以能放下一个short

内存对齐能够提高操作系统访问的效率,因为它可以以块为单位存取数据,而不需要以字节为单位(这是我理解的部分,网上有博客说有的操作系统不能随机访问任意部位所以需要内存对齐)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值