编程范式随课笔记(二)
来源:互联网 发布:第三方辅助软件 编辑:程序博客网 时间:2024/06/05 22:59
存储器构成
堆
通过malloc/realloc分配的空间,会比实际指定的多4或8个字节(紧跟着返回的地址前)用来储存对malloc有用的信息,比如申请空间的大小信息。
int *arr = malloc(100*sizeof(int));free (arr+60);
free函数会机械的,从arr+60前的字节提取信息,然后删除。假如前面字节记录的数为265,那会将后面265个字节都释放。
堆内存管理器细节:因为自动分配的空间在堆中是零散的,那就会浪费很多空间,这时就希望能把空间尽可能的靠在一起,然后留下足够多且连续的空间给接下来要申请的空间。方法的话,可以将那些零散的空间搬运到一块,但是问题是返回的指针已经给了用户,这会导致错误,因此用另一种方法,从堆中分出一部分为the handle ,另一部分还是traditional heap manager,相当于返回给用户的指针离实际数据地址有两跳(没弄懂,那用户岂不是每次都要**才能取到值咯)。貌似这种压缩方法是mactonish7.0使用的。csapp里的合并策略跟这个不同,用的是边界标记技术。
栈(通常在高位地址中)
栈的活动程度跟里边函数的数量成正比。函数里面的局部变量都存在栈中,每次调用函数的时候,栈指针就会偏移函数所占空间大小的距离。
代码段
汇编代码
不同型号的汇编语言不同,课程里用的是自制的语言来帮助理解。但是在某些设计实现上应该采用的的同样的策略,下面就是讲这些策略。
特点,和上下文无关,每条指令独立执行,简单又高效。
汇编是怎么解决循环控制的呢,依靠一个特殊的寄存器PC(程序计数器),用来记录当前执行指令的地址。然后jmp指令能跳到指定的指令地址,然后接着顺序执行下去。
汇编语言的设计尽可能保证绝对正确,比如for循环能跳到前几个语句,以便少处理几个指令,但一旦这么设计了,整体的语言哲学就被破坏了,到最后可能lose control。
假如设计的汇编代码有59种操作类型,每条命令占32个字节,前6个字节记录的是操作码,硬件通过检查这个区域的值,来获取指令执行的类型。
寄存器和内存相连用于数据的交换,和算数逻辑单元(arithmetic logic unit)相连,进行一系列运算(指令集得以执行)
- 编程范式随课笔记(二)
- 编程范式随课笔记(一)
- 斯坦福大学开放课程:编程范式学习笔记《二》
- 编程范式学习笔记
- 《编程范式》学习笔记
- 编程范式2 笔记
- 编程范式11 笔记
- 编程范式13 笔记
- 编程范式14 笔记
- 编程范式23 笔记
- 《编程范式与编程语言》笔记与摘要(一)
- Programming Paradigms 编程范式-笔记
- 编程范式5 笔记 泛型
- 编程范式七 笔记 泛型栈
- 编程范式16 笔记 信号量
- (二)基本范式
- <<编程范式>>第四课重点笔记与总结
- 斯坦福大学公开课:编程范式(一)
- 《程序的编译,链接,运行》读书笔记
- Java 中按值传递和引用传递的区别
- 转载自廖雪峰的网站,只是为了便于保存,---gita安装
- 初识OC 面向对象OPP(MS)
- 用 FileChannel 拷贝文件
- 编程范式随课笔记(二)
- 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE解决办法
- 第三只眼看费城自由钟---旅美散记之四
- 详解java类的生命周期
- matlab工具箱LS-SVMlab的安装
- Spring MVC+MyBatis+MySql 具体实践
- 【HTML】Canvas(2)-绘制文本
- C语言中数组名并非数组首地址
- thinkphp 页面跳转传递参数