c语言-内存

内存对齐,提高寻址效率

内存对齐
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

内存模型

在这里插入图片描述
地址从低到高:

  • 程序代码区
  • 常量区
  • 全局变量区
  • 内核空间

new和delete & alloc和free

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值