内存对齐是什么?为什么要对齐?怎么对齐?

内存对齐是指将数据存储在字的整数倍地址,以提高处理器访问效率和避免异常。处理器可能要求数据对齐,非对齐访问可能导致额外开销或异常。编译器通常自动进行内存对齐,但可以通过`__attribute__((aligned(n)))`等手段手动调整。了解内存对齐有助于优化数据结构的存储空间利用率。
摘要由CSDN通过智能技术生成

看C++源码遇到一个比较陌生的语法:__attribute__((aligned)),例如int x __attribute__ ((aligned (16))) = 0;,秉持着不懂就要问的态度,咨询了下搜索引擎。发现__attribute__是GNU C对ISO C(ISO标准C)的扩展的语法中的一个,它包括了对C、Objective-C、C++的扩展。其实也就是GCC自己扩展了一些它自己能接受的语法,GCC预定义了一个宏__GNUC__,如果检测到定义了这个宏,就说明支持这些语法了。
__attribute__是这些扩展中的一个,用于告诉GCC编译器某些结构所具备的一些属性1。而__attribute__((aligned))就是告诉编译器某个变量或者数据结构中的某一成员需要进行数据对齐,例如:

int x __attribute__ ((aligned (16))) = 0;

这个定义要求编译器将变量x按16个字节进行对齐。
__attribute__的问题解决了,但是却又引入了一个新的疑问:内存对齐(memory alignment)。

什么是内存对齐

所谓内存对齐,就是将数据存放到一个是字的整数倍的地址指向的内存之中。处理器在执行指令去操作内存中的数据,这些数据通过地址来获取。不论什么数据都有一定的大小,当一个数据所在的地址和它的大小对齐的时候,就说这个数据自然对齐了(naturally aligned),否则就是没对齐。
怎么理解数据的地址和它的大小对齐这句话呢?例如有一个地址a,它是n的整数倍,并且这个n是2的幂,这时候我们就可以说an个字节对齐了。举个栗子:当 a = 0x00000008,n = 4,2

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值