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

来源:互联网 发布:报表类软件 编辑:程序博客网 时间:2024/05/18 00:30

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进行加法乘法移位操作

原创粉丝点击