编程范式 epesode7,8 stack存放指针类型and heap,register

2023-05-20,,

这一节从后往前写。

____stack and heap

___stack由 汇编语言操控管理,数据先入后出。

栈是存放局部变量,函数调用子函数时,该函数在栈中占用的空间会增大,用于存放子函数的局部变量。很明显的逻辑,必须被调用的子函数的局部变量被释放以后才能存取调用函数的局部变量,先入后出就是这么理所当然的事情。

不是说栈就是定义要求先入后才的,而是程序本身具有这样的需求,给了这个空间一个名字,叫做栈。//这个老师讲得特别基本朴实,把最实在的道理讲给你听,而以前的老师多是生怕自己讲得不够复杂,生怕你听懂似的,简单的东西也弄得复杂以显示自己的学问的高深,这是嘲讽;更多的情况是讲不出来,用简单的话说明白,这真不是谁都能做到的。反正这个老师挺可爱的,特别可爱,非常可爱。

___heap由堆管理器管理,是用软件实现的。malloc, remalloc, free

堆的存储,总是从最开始的指针地址开始搜寻,找到需要的空间大小。所以heap中都是一段一段的,因为之前申请的空间可能中途被释放了,那里就空了一块。堆中的空闲空间称为空闲列表。堆管理器利用void* 类型的指针去搜寻空闲列表。下节课会继续。

每次在堆中分配空间时,比如int * arr = malloc(40*sizeof(int));实际分配的空间是大于160,实际上占用164或168个字节,因为需要最开始的一些字节来记录这段内存的大小。_因此一段空间的首地址具有特别的意义,堆管理器的内部软件函数可以在这个首地址的左边的一定字节内找到这段内存的相关信息,比如大小,这样才能正常的对堆进行管理。所以,          free(arr+60);这样的语句是错误的,因为首地址是错误的。

_____register

用于对RAM中的数据进行存取。存取RAM中的数到register,再利用RLU(算术逻辑单元)进行计算处理。RAM中的数不能直接利用RLU来处理,因为速度会非常慢,所以必须通过register作为中转再进行处理。

_____memmove, memcpy

rotate。一个数组,把前面一部分切割移到后面,原来后面的向前移。为了应用和区分memcpy 和 memmove

memmove 可以用于空间overlapping的拷贝,既然多了功能,效率就比较低,所以如果不是必须得用它就不要用,

///jerry说这样去看这件事,要是不该用memmove的时候也用它,计算机性能就会被拖累到崩溃。这老师太好玩了。他热爱他所做的事,对他来所这是非常有趣的,非常美妙神奇的世界。//不是好玩,是因为太在意,太热爱了,太殷切了。

___code, 真是没有简单容易的程序,是程序就有要注意的地方。用jerry的话说,there are many things to be messed up.

___指针的减法和加法一样,指针的类型会被隐含计算进去。must char* type, the deduct operation involes the type size!!

rotate(void* front, void* middle,void* end)
{ //////must char* type, the deduct operation involes the type size!!
uchar frontSize = (uchar*)middle - (uchar*)front;
uchar backSize = (uchar*)end - (uchar*)middle;
uchar buffer[frontSize];
memcpy(buffer,front,frontSize);
memmove(front,middle,backSize);
memcpy(front+backSize,buffer,frontSize);
}

___stack 存放指针类型

放在上一节课的笔记里。

编程范式 epesode7,8 stack存放指针类型and heap,register的相关教程结束。

《编程范式 epesode7,8 stack存放指针类型and heap,register.doc》

下载本文的Word格式文档,以方便收藏与打印。