4.1.1.计算机的内存:
譬如Java语言对内存的使用就是进一步的封装,我们可以用new来创建对象(其实就是为对象分配内存),用完后Java虚拟机会自动调用垃圾回收器来释放内存,若内存不释放,这就是内存泄漏了。
冯诺依曼结构: 一种将程序指令存储器和数据存储器合并在一起的电脑设计概念结构和哈弗结构: 是一种将程序指令储存和数据储存分开的存储器结构(如ARM等一些嵌入式芯片)。
4.1.3.位、字节、半字、字的概念和内存位宽
内存就是用来存放变量的(就是因为有了内存,所以C语言才能定义变量,C语言中的一个变量实际就对应内存中的一个单元)。1byte=8bit
内存芯片之间是可以并联的,通过并联后即使8位的内存芯片也可以做出来16位或32位的硬件内存。
4.1.4.内存编址和寻址、内存对齐
内存地址和其对应的格子空间是一一对应且永久绑定的。
程序运行时,计算机中CPU实际只认识内存地址,而不去关心这个地址所代表的空间在哪里,怎么分布这些实体问题,硬件设计保证了用地址一定能找到对应的格子。 (内存编址是以字节为单位的,8bit)
所以现在写程序主要以程序运行的效率和用户体验为主。
内存对齐访问,四个字节空间连在一起,类似邻居,0 1 2 3 ,效率高
4.1.5、C语言如何操作内存的
Int a;//编译器帮我们申请了1个int类型的四个内存格子(地址只有编译器知道),并且把符号a和首地址的这个格子绑定。
C语言中数据类型的本质含义是:表示一个内存格子的长度和解析方法。
函数名的实质就是这一段代码的首地址,函数名的本质也是一个内存地址。
结构体与数组的差别还是差在了内存上面了,数组因为地址分布规律,可计算。因为结构体中的元素分配的内存不同,无法计算得到内存地址,所以通过 . 来引用。
4.1.6、结构体内嵌指针实现面向对象
Void (*pFunc)(void); //函数指针,指向void func(void)这类函数。类似Java中的成员方法。
4.1.7、内存管理之栈(stack)。C中局部变量就是使用栈来实现的
栈:先进后出。队列:先进先出。
栈的特点是入口即出口,只有一个口,另一个口是堵死了,所以先进去的必须后出来
队列的特点是入口和出口都有,必须从入口进去,从出口出来,所以先进去的先出来,否则就堵住后面的。
栈有入栈和出栈的概念,在定义局部变量的这段栈内存中是反复使用的,是脏的,所以局部变量不初始化,值是随机的。
栈是有大小的,栈的溢出危害很大,一定要避免。
4.1.8、内存管理之堆(heap)
我们什么时候使用堆内存?需要内存容量比较大时,需要反复使用及释放(malloc),很多数据结构(譬如链表!)的实现都要使用堆内存。
程序员必须手动写代码malloc和free,如果程序员申请内存使用后未释放,这段内存就丢失了(在堆管理器的记录中,这段内存仍然属于你这个进程,但是进程自己又以为这段内存已经用了,再用的时候又会去申请新的内存块,这就叫吃内存。)(即内存泄漏)。
Void *realloc(void *ptr,size_t size); //改变原来申请空间的大小,1:重新申请了一块空间,2:将原来的元素copy进去,3:free释放原来的空间
4.1.9、复杂数据结构
树和图了解就好,hash table与字符驱动设备有关。(用到什么,认真去学什么。)。链表在linux内核中使用非常多,驱动、应用编写很多时候都需要使用链表。所以对链表必须掌握,掌握到:会自己定义结构体来实现链表、会写链表的节点插入(前插、后插)、节点删除、节点查找、节点遍历等。(至于像逆序这些很少用,掌握了前面那几个这个也不难)