从接触Linux开始,一直学习并使用C语言,C语言与Linux是相辅相成的。从刚开始对C的了解学习到慢慢熟练使用,渐渐认识到C的精妙,C语言比较贴合底层硬件,要求编码时对程序更精确的掌控。linux
经过阅读《C专家编程》,对C语言的理解包括编译等都有了更深入的了解,C强调一切由程序员实现,编码时须要保证本身程序的准确,《C专家编程》给我最有意义的认识是:在编码时更清楚程序的运行细节,从底层硬件及Linux系统函数实现的角度更深刻的认识了高质量编码。程序员
书中经过实例讲解,并给出编程挑战,阅读跟实践相结合,加深了对内容的理解,编程实现的同时让人有茅塞顿开的感受。下面总结几个印象最深入的知识点:编程
一. 程序运行时的数据结构:数组
清楚的了解了可执行程序的各个段(文本段、数据段、bss段),以及其在内存中的布局(以下图)。数据结构
1.编译“hello world”程序,在可执行文件中执行ls -l,获得文件的整体大小。运行size获得文件里各个段的大小。函数
2.增长一个全局的int[1000]数组声明,从新进行编译,再用上面的命令获得整体及各个段的大小。能够清楚看到增长全局的未初始化的int数组,都保存在bss段。布局
3.如今,在数组的声明中增长初始值(C语言并不强迫对数组进行初始化时为每一个元素提供初始值)。能够看到初始化全局数组后,使数组从BSS段转换到数据段。学习
4.在函数内声明一个巨大的数组。而后再声明一个巨大的局部数组,最后在加入一个函数,并在函数内部声明一个大数组。能够看到后面增长的局部大数组声明都布局在文本段。优化
二.对内存的思考编码
阅读此章节后,对Intelx86的内存工做原理以及MMU都有了进一步的理解,并对linux自己的系统函数实现及贴合硬件的优化进行了学习和了解(例如提到的memcpy函数的优化实现),总结一下印象比较深的几个知识点:
1.虚拟内存
a.虚拟内存 – 使用磁盘保存运行进程的映像,经过“页”的形式组织,页就是磁盘和内存之间来回移动的单位
b.在磁盘上有个特殊的交换区,用来保存从内存中换出的进程
c.进程只能操做位于物理内存中的页面
2.Cache
a.Cache的操做速度域系统的周期时间相同
b.Cache包含一个地址的列表以及它们的内容,全部对内存的读取和写入都要通过cache
c.Cache采用写直达,写回法,保持命中
d.行Line是对Cache进行访问的单位,一个行内的数据成为块block
3.堆和数据段
a.堆中的全部东西都是匿名的,不能按名字访问,只能经过指针
b.堆内存的回收没必要与所分配顺序一致,它甚至能够不回收
c.管理内存的调用:malloc、free、brk和sbrk(调整数据段的大小)
4.内存泄漏
a.堆常常出现两种类型的问题
b.释放和改写仍在使用的内存(内存损坏)
c.未释放再也不使用的内存(内存泄漏)
每次malloc后,调用free释放它。或者,尽量地使用alloca来分配,它会被自动释放掉。
5.总线错误
a.总线错误计划局都是因为未对齐的读和写引发的,而数据项是不能跨越页面或Cache边界的
b.编译器经过自动分配和填充数据来进行对齐
以上是本身在阅读笔记中总结的印象比较深入的两个点,看《C专家编程》的同时,实例编码调试,从不一样的角度、深度去理解了C编程的奥妙,仍是比较有成就感的。书中不少有趣的IT历史事件,项目实例等也让我获益匪浅,总之,即便多了点滴认识,也是很愉快的:)。