《Expert C Programming》閱讀筆記

  從接觸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歷史事件,項目實例等也讓我獲益匪淺,總之,即便多了點滴認識,也是很愉快的:)。

相關文章
相關標籤/搜索