1关于堆内存管理的细节
使用malloc函数使,返回的一段内存地址大小实际大于申请的大小,在返回的指针首地址:addr,向前偏移四个Byte或者8个Byte的内存地址,存储着申请的内存大小。
对于如下操作:
int arr = malloc(100sizeof(int));
free(arr+60);
调用free函数,在找到偏移60个之后,会先前寻找4个或8个Byte的内存,解释为内存长度,并将之后的内存释放为空闲的地址链表(这样就会出现可怕的后果);
例如:
int array[100];
free array;
同样会向前操作4个Byte,讲里边内存内容解释为后续需要释放为空闲链表的内存的大小。
对于数组越界,当进行(-1)操作,可能会对malloc申请的前四个字节信息进行擦除。导致后续内存释放产生可怕的后果;
malloc, realloc,free都是依赖软件管理实现的操作函数。
2 栈内存块的管理:
(1)局部变量依次排列形成栈帧,记录下来;
(2)按照函数调用顺序,栈的活动首地址进行栈帧偏移;
(3)栈帧只能访问当前活动记录,不能向下或向上访问;
(4)调用结束后,该栈帧不可访问(实际还有信息),首地址向上偏移;
(5)下次调用函数向下覆盖内存地址的信息;
3有关计算机的架构:
代码编译时,存在内存中有一块区域称为代码段。
RAM通过物理与寄存器直连,寄存器与ALU(算术逻辑单元)直连。ALU完成加减法以及移位掩码等操作。这种方法可以极大的加快运算操作速度,ALU与RAM直连计算速度会非常慢。
实际代码汇编操作为:将RAM中的信息取出(load),写入某几个寄存器,使用ALU完成运算后存入另一个寄存器,最后写入RAM的某个内存地址中。
编程范式,5/11/18
最新推荐文章于 2023-03-24 02:37:58 发布