天天看點

麻省理工《C記憶體管理和C++面向對象程式設計》筆記---第一講:認識C和記憶體管理

最近一年都在用.net和Java,現在需要用C了。昨天看到部落格園首頁的麻省理工開放課程,就找來看看,正好複習一下。這門《C記憶體管理和C++面向對象程式設計》不是那種上來就變量,循環的千篇一律的講法,而是重點講C的核心機制如記憶體管理、指針等,這對于我這種有一定程式設計基礎,但很久沒用C的人比較适合。簡明的plain English,加上生動有趣的描述,看起來即暢快,又令人深受啟發。不得不感慨MIT的水準。下面是我整理的筆記(部分翻譯自課件,部分自己的總結):

  原版課件見課程官方首頁:

點選   課程中推薦的C/C++線上學習資料:http://www.cprogramming.com (個人覺得好的英文資料,讀得時候雖然時不時要查查字典,但是比很多中文的都更容易了解,畢竟國外牛人多)

1. C語言家族

 1) C: Dennis Ritchie于1972年在貝爾實驗室開發出來;是一種指令式語言(imperative system language)

 2) C++: Bjarne Stroustrup于1979年在貝爾實驗室開發出來;是一種支援泛型(generics)的指令式,面向對象的語言

 3)C#: 2001年,由微軟開發。是一種多範型(multi-paradigm)程式設計語言,支援指令式、函數、泛型、面向對象和記憶體管理。

 注:指令式語言又稱強制式語言,通過指明一系列可執行的運算及運算的次序來描述計算過程的語言。平時我們用的大多數語言(比如,C,C+,Java,C#,Python等)都是指令式語言。與它相對的是函數式語言(functional language),如Haskell,Lisp。函數式語言更像數學,指令式語言更接近人的思維。

2. C的典型特征:

 1)編譯型語言(compiled language)(相對于解釋型語言來說)

   編譯型語言:程式在執行之前需要一個專門的編譯過程,把程式編譯成為機器語言的檔案,運作時不需要重新翻譯,直接運作編譯的結果就行了。是以效率高

   解釋型語言:程式不需要編譯,程式在運作時才翻譯成機器語言,每執行一次都要翻譯一次。是以效率比較低

 2)指令式的

 3) 人工管理記憶體

 4)當需要涉及以下問題時使用C:

   -速度

   -記憶體

   -低層次特性(low-level features),如:移動stack pointer等

3. 記憶體抽象的層次(從記憶體的角度思考C...) 

  抽象層次                        程式設計語言

  -------------------------------------- 

  直接操作記憶體                     彙編語言

  通路記憶體                         C,C++

  記憶體自動管理                     Java,C#,Scheme/LISP,ML

4. C通路的記憶體:堆(heap)

   堆是一塊兒用于動态記憶體配置設定的記憶體區域

   1)把它想像稱為一個巨大的數組

   2)通過指針(pointer)來通路

   3)整個程式都能通路堆(如果作業系統允許的話) 

5. 人工記憶體管理

  目的:

  1) 允許程式能夠配置設定記憶體用于目前的使用

  2)當程式執行完後,能夠釋放記憶體,用于重新配置設定

  C語言的标準類庫(standard library)中有malloc和free兩個函數支援記憶體管理

6. 其它C通路的記憶體:棧(stack)

  C語言中棧是編譯器自動配置設定和回收,用于存放函數及其參數,局部變量等的記憶體區域 

  C函數将會配置設定到棧中:

  1)函數在被調用時進棧(pushed on to stack)

  2) 函數在傳回時出棧(popefd off the stack)

  3) 函數能通路目前棧頂部以下的所有記憶體(這裡所謂的“頂部以下”如下圖所示)

麻省理工《C記憶體管理和C++面向對象程式設計》筆記---第一講:認識C和記憶體管理

 7.一些基本的C文法如變量,循環,分支等跳過。

 8. 編譯器。推薦使用GCC,一般是在linux下用gcc+gedit寫C程式。

 9. 調試工具:gdb和valgrind。

    gdb文檔: http://www.gnu.org/software/gdb/

    valgrind文檔:http://valgrind.org/

 10. 課後作業1及源碼:

    課件主要是提供思路和引導,課後作業才是鍛煉的最好途徑。