编程范式8 笔记 C/C++内存

heap

在低地址

malloc分配heap的地址

int* arr=malloc(40*sizeof(int));

160B(实际164B或者168B,多出来的在头部,用于记录大小等信息,但是返回的指针是在这个头的后面)
执行free函数时,指针会机械地回退4B or 8B 获取大小信息,并且free掉后面相应大小的内容

int* arr=malloc(100*sizeof(int));
free(arr+60);
//出错,指针会调到arr+58/59,将这里面的内容解释为内存块大小再释放
int arr[100];
//这样静态申请与堆无关,但也有head信息
free(array);
arr[-1]=0;
//这样把头覆盖掉了,会出错

空闲的空间组成一个链表,每个head信息都记录了大小,下次malloc的时候遍历一遍
怎么分配《操作系统》会讲
free只是把内存块加到空闲链表,因为反正可以覆盖
操作系统可以把分散的零碎的空间弄成连续的空间,返回句柄(二级指针,是一个指针列表)

void** handle=NewHandle(40);
Handlelock(handle);
//告诉操作系统不要挪动NewHandle指向的内存,它们正在被句柄寻址
HandleUnlock(handle);

stack

void A()
{
    int a;
    short b[4];
    double c;
    //从栈里分配内存
    B();
    C();
}

栈里有指针(栈指针)记录已分配和未分配的边界,每有一个新函数分配局部变量,他会移动,并将移动后的地址作为函数访问变量的基地址;函数返回后,栈指针回退。

void B()
{
    int x;
    char* y;
    char* z[2];
    C();
}
void C()
{
    double m[3];
    int n;
}

汇编代码

简单讲了下
假设RAM有32个通用寄存器
ALU进行加法乘法移位操作

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值