巨集 內聯函式, 記憶體對齊,

2021-08-19 00:11:45 字數 1952 閱讀 8000

預處理(.i)-巨集定義,條件編譯指令,注釋

編譯(.s)

彙編(.o)-二進位制檔案,機器指令,與上一步統稱為編譯

鏈結(.exe)-將相關檔案彼此鏈結

巨集,簡單的替換

內聯函式(inline),節約一些小函式頻繁呼叫,大量消耗棧空間的問題。

inline必須與函式的定義放在一起,才能是內聯函式,編譯時處理內聯。

volatile,與const相對,volatile 關鍵字是一種型別修飾符,用它宣告的型別變數表示可以被某些編譯器未知的因素更改,

比如:作業系統、硬體或者其它執行緒等。

遇到這個關鍵字宣告的變數,編譯器對訪問該變數的**就不再進行優化,從而可以提供對特殊位址的穩定訪問。

宣告時語法:int volatile vint; 當要求使用 volatile 宣告的變數的值的時候,系統總是重新從它所在的記憶體讀取資料,即使它前面的指令剛剛從該處讀取過資料。

在單任務的環境中,乙個函式體內部,如果在兩次讀取變數的值之間的語句沒有對變數的值進行修改,那麼編譯器就會設法對可執行**進行優化。

由於訪問暫存器的速度要快過ram(從ram中讀取變數的值到暫存器),

以後只要變數的值沒有改變,就一直從暫存器中讀取變數的值,而不對ram進行訪問。

(1)並行裝置的硬體暫存器(如:狀態暫存器); 

(2)乙個中斷服務子程式中會訪問到的非自動變數(non-automatic variables); 

(3)多執行緒應用中被幾個任務共享的變數。

在記憶體中的儲存形式,數值以補碼表示,字元以ascii**表示。

任何資料都是以二進位制形式在記憶體中存放的。

關於指標變數的長度,指標不是一般變數,存的是變數的位址,在同一架構下位址長度都是相同的(cpu最大定址記憶體空間),

所以不同型別的指標長度都是相同的。

記憶體對齊的3大規則:

1 對於結構體的各個成員,第乙個成員的偏移量是0,排列在後面的成員其當前偏移量必須是當前成員型別的整數倍

2 結構體內所有資料成員各自記憶體對齊後,結構體本身還要進行一次記憶體對齊,保證整個結構體占用記憶體大小是結構體內最大資料成員的最小整數倍

3 如程式中有#pragma pack(n)預編譯指令,則所有成員對齊以n位元組為準(即偏移量是n的整數倍),不再考慮當前型別以及最大結構體內型別

資料成員放入記憶體的時候,記憶體拿出乙個記憶體塊來,資料成員們排隊乙個乙個往裡放,遇到太大的,不是把自己劈成兩半,能放多少放多少,而是等下乙個記憶體塊過來。

struct mn

sizeof(mn) = 1 + (3) + 4 + 1 + (3) = 12 (中間補,最後補)

union型別比較特殊,計算union成員的偏移量時,需要根據union內部最大成員型別來進行緩衝補齊

c++標準規定:乙個空類的大小為1個位元組

引用和指標:

引用必須被初始化且只能初始化為另乙個變數,但是不分配儲存空間

指標不宣告時初始化,在初始化時分配儲存空間

引用初始化以後不能改變,指標可以改變所指的物件

不存在指向空值的引用,但是存在指向空值的指標

過載-名稱相同,但是引數列表數目或者型別不同

覆蓋-名稱相同,引數列表數目和型別相同,被覆蓋的不能使static,必須是virtual。

重定義-派生類對基類方法的重定義,函式名必須相同

多型-為了避免在父類裡大量過載引起**臃腫且難以維護

靜態多型性-通過函式過載實現  動態多型性-通過虛函式實現

set和multiset

會根據特定的排序準則,自動將元素進行排序,不同的是後者允許元素重複而前者不允許,

#include

通常以紅黑樹實現的,自動排序的優點是使得搜尋元素時具有良好的效能,具有對數時間複雜度。

但是造成的乙個缺點就是:

不能直接改變元素值。因為這樣會打亂原有的順序。

改變元素值的方法是:先刪除舊元素,再插入新元素。

訪問元素只能通過迭代器,從迭代器的角度看,元素值是常數

記憶體對齊巨集ALIGN

對於正整數 2 n n 1 來說,存在這樣的特性,如果整數x是 2 n的整數倍,則 x的二進位制形式的低n位為 0,如果x 不是2 n 的整數倍,則x與 2 n 1 進行與運算可以得到乙個與 x相近的是 2 n整數倍的正整數。這個特性經常用於記憶體分配時對齊。如果是上對齊,則需要先加上 2 n 1 ...

巨集與內聯函式

函式作為一種抽象機制,對解決大型複雜問題起到了很大作用。但是,由於函式呼叫時需要開銷的,例如,函式呼叫時需要保護呼叫者的執行環境,進行引數傳遞,執行呼叫命令,為區域性變數分配空間以及執行返回指令等,因此函式會帶來程式執行效率的下降,特別是對一些小函式的頻繁呼叫。c 提供了兩種解決上述問題的辦法 巨集...

巨集與內聯函式

建議 1 使用const定義常量而不是 define 2 使用inline內聯函式而不是 define來定義小型函式 第一部分 巨集 為什麼要使用巨集呢?因為函式的呼叫 必須要將程式執行的順序轉移到函式所存放在記憶體中的某個位址,將函式的程式內容執行完後,再返回到轉去執行該函式前的地方。這種轉移操作...