内存对齐,提高寻址效率
内存对齐
1)什么是内存对齐
内存空间按照字节划分的,理论上变量可以随意存放,但是实际上数据存放位置有限制,数据的首地址是某个数k(通常它为4或8)的倍数
2)为什么要内存对齐
内存空间按照字节划分,但大部分处理器不是以字节为单位存取数据,而是以2/4/8/16/32字节为单位存取,这些存取单位称为块block
假如没有内存对齐机制,现在一个int变量存放在从地址1开始的连续四个字节中,取数据时,要先从0地址开始读取第一个4字节块,剔除不想要的字节(0地址),然后从地址4开始读取下一个4字节块,同样剔除不要的数据(5,6,7地址),最后留下的两块数据合并放入寄存器.这需要做很多工作
3)结构体的内存对齐规则
对齐系数:编译器默认,gcc为4个zijie
对齐单位:min(对齐系数, max(结构体中成员数据类型长度))
- 相对于的单元(一个对齐单位)起始位置,第一个成员的偏移量为0
- 确定i+1个成员偏移量
第i个成员偏移量 + 第i+1个成员数据类型长度
<= 对齐单位,那么 第i个成员和第i+1个成员在内存中无缝衔接,且处于同一个单元中
> 对齐单位,那么第i+1个成员处于第i个成员所处单元之后的单元内 - 对齐单位中没有写入数据的字节由编辑器自动填充
4)什么时候不应该内存对齐?
什么时候不希望进行内存对齐呢?一般来说,当我们追求空间效率而不是时间效率时,我们可以选择取消或者减小内存对齐。例如,在嵌入式系统中,由于资源有限,我们可能更关心节省空间而不是提高速度。此时我们可以使用编译器提供的选项来调整或者关闭内存对齐。
负数在内存中的存储
以补码的形式储存
例如:十进制 -9 (short int 型16bit)
原码(负数符号位为1):1000 0000 0000 1001;
反码(符号位不变,数值位按位取反):1111 1111 1111 0110;
补码(反码的末位加1):1111 1111 1111 0111
内存模型
地址从低到高:
- 程序代码区
- 常量区
- 全局变量区
- 堆
- 栈
- 内核空间