C专家编程--读书笔记六 运行时数据结构
生活随笔
收集整理的這篇文章主要介紹了
C专家编程--读书笔记六 运行时数据结构
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
第六章 一、知識點 1、代碼和數據的區別也可以認為是編譯時和運行時的分界線。編譯器的絕大部分工作都跟翻譯代碼有關;必要的數據存儲管理的絕大部分都在運行時進行。(P121) 2、"a.out"是“assembler output(匯編程序輸出)”的縮寫形式。(P121) 3、就目標文件而言,段(segments)是二進制文件中簡單的區域,里面保存了和某種特定類型(如符號表條目)相關的所有信息。一個段一般包含幾個section。段表示一個二進制文件相關的內容塊。(P122) 4、一個可執行文件一般包含三個段:文本段、數據段、bss段(由符號開始的塊)。BSS段只保存沒有值得變量,所以事實上它并不需要保存這些變量的映像。運行時需要的BSS段的大小記錄在目標文件中,但BSS段(不像其他段)并不占據目標文件的任何空間。a.out以段的形式組織。(P124) 5、段可以方便地映射到連接器在運行時可以直接載入的對象中!載入器只是取文件中每個段的映像,并直接將它們放入內存中。從本質上說,段在正在執行的程序中是一塊內存區域,每個區域都有特定的目的。(P125) 6、文本段包含程序的指令;數據段包含經過初始化的全局和靜態變量以及它們的值;BSS段的大小從可執行文件中得到,然后連接器得到這個大小的內存塊,緊跟在數據段之后。包含數據段和BSS段的整個區段通常統稱為數據區。這是因為在操作系統的內存管理術語中,段就是一片連續的虛擬地址,所以相鄰的段被結合。一般情況下,在任何進程中數據段是最大的段。堆棧段用于保存局部變量、臨時數據、傳遞到函數中的參數等。同時,我們還需要堆空間,用于動態分配的內存。虛擬地址空間的最低部分未被映射。也就是說,它位于進程的地址空間內,但并未賦予物理地址,所以任何對它的引用都是非法的。在典型情況下,它是從地址零開始的幾K字節。它用于捕捉使用空指針和小整型值得指針引用內存的情況。(P125) 7、堆棧段有三個主要的用途,其中兩個跟函數有關,另一個跟表達式計算有關:(P127) (1)、堆棧為函數內部聲明的局部變量提供存儲空間。按照C語言的術語,這些變量被稱為“自動變量”。 (2)、進行函數調用時,堆棧存儲于此有關的一些維護性信息。這些信息被稱為堆棧結構,另外一個更常用的名字是過程活動記錄。它包括函數調用地址(即當調用的函數結束后調回的地方)、任何不適合裝入寄存器的參數以及一些寄存器值的保存。 (3)、堆棧也可以被用作暫時存儲區。 除了遞歸調用之外,堆棧并非必須。因為在編譯時可以知道局部變量、參數和返回地址所需空間的固定大小,并可以將它們分配于BSS段。 在絕大多數處理器中,堆棧是向下增長的,也就是朝著低地址方向生長。 8、過程活動記錄:(P128) 在X86架構中,運行時系統維護一個指針(常位于寄存器中),通常稱為fp,用于提示活動堆棧結構。它的值是最靠近堆棧頂部的過程活動記錄的地址。 9、不能從函數中返回一個指向該函數局部自動變量的指針。因為當進入該函數時,自動變量在堆棧中分配。當函數結束后,變量不復存在,它所占用的堆??臻g被收回,可能在任何時候被覆蓋。如果想返回一個指向在函數內部定義的變量的指針時,要把那個變量聲明為static。(P132) 10、盡管通常說“將過程活動記錄壓倒堆棧中”,但過程活動記錄并不一定要存在于堆棧中。事實上,盡可能地把過程活動記錄的內容放到寄存器中會使函數調用的速度更快,效果更好。(P132) 11、對于如何在進程中支持不同的控制線程是比較清楚的了,只要簡單地為每個控制線程分配不同的堆棧即可。(P133) 12、setjmp()和longjmp()是通過操縱過程活動記錄實現的,這兩個函數協同工作:(P133) (1)、setjmp(jmp_buf j)必須首先被調用。它表示“使用變量j記錄現在的位置。函數返回零。” (2)、longjmp(jmp_buf j, int i)可以接著被調用。它表示“回到j所記錄的位置,讓它看上去像是從原先的setjmp()函數返回一樣。但是函數返回i,使代碼能夠知道它實際上是通過longjmp()返回的。” (3)、當使用于longjmp()時,j的內容被銷毀。 setjmp保存了一份程序的計數器和當前的棧頂指針。longjmp恢復這些值,有效地轉移控制并把狀態重置回保存狀態的時候。 13、longjmp會導致轉移,但是它和goto又有不同,區別如下:(P133) (1)、goto語句不能跳出C語言當前的函數; (2)、用longjmp只能跳回到曾經到過的地方。在執行setjmp的地方仍留有一個過程活動記錄。longjmp接收一個額外的整型參數并返回它的值,這可以知道是由longjmp轉移到這里的還是從上一條語句執行后自然而然來到這里的。 需要注意的是:保證局部變量在longjmp過程中一直保持它的值得唯一可靠方法是把它聲明為volatile。 setjmp/lognjmp最大的用途是錯誤恢復。只要還沒有從函數中返回,一旦發現一個不可恢復的錯誤,可以把控制轉移到主輸入循環,并從那里重新開始。setjmp和lognjmp在C++中變異為異常處理機制“catch”和“throw”。 14、標準的代碼優化技巧包括:消除循環、函數代碼就地擴展、公共子表達式消除、改進寄存器分配、省略運行時對數組邊界的檢查、循環不變量代碼移動、操作符長度削減(把指數操作變為乘法操作,把乘法操作變為移位操作或加法操作等)等。 二、問題 1、查看frame.h文件?(P131) 2、要求讀入一個內容是10000個數值的文件,并計算這些數值的平均數。你的程序的運行時間必須盡可能地短。(P140)
轉載于:https://www.cnblogs.com/lydf-2012/archive/2012/04/30/2477370.html
總結
以上是生活随笔為你收集整理的C专家编程--读书笔记六 运行时数据结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何给Android应用创建本地服务
- 下一篇: 谈理论与实践