C 程式設計思想學習筆記 第九章 內聯函式

2021-07-02 15:26:19 字數 1293 閱讀 1437

第九章  內聯函式

為了解決c中不太方便,且容易出錯的巨集定義的問題,c++中使用內聯函式來代替。內聯函式有三大優點:1) 增加了引數檢查,保證了**的正確性 2) 仍然像c中一樣,內聯函式在呼叫處展開,而不是像普通函式一樣需要壓棧,return等返回,減少了函式呼叫的開銷

。3)能像一般的成員函式一樣可以在類裡訪問自如。

一、預處理器的缺陷

#define f (x) (x+1)

f(1)

(x) (x+1)(1)

看上面這段**,程式設計師的本意應該是想定義乙個函式f(x)實現乙個將引數x加1的操作,為了方便,他將其定義為乙個巨集定義。f   (x)之間,請注意,是有空格的。這樣f(1)將被替代成(x) (x+1)(1),而不是我們預想的(1+1)。對於看似像函式的巨集定義可能產生的意想不到的錯誤,稍有經驗的程式設計師應該早有領教。

二、巨集和訪問

class x

;

上面這段**,想在類x中定義乙個與類x的資料成員i有關的類似函式的巨集定義。然而這是不可能的,巨集定義只執行簡單的**替換工作,預處理器也不可能知道x與i的關係。程式設計者出於效率考慮,不得不讓一些資料成員成為public型別,這就會暴露內部實現並妨礙在這個實現中的改變,從而消除了private提供的保護。

三、內聯函式

在c++中,巨集的概念是通過內聯函式來實現的,而內聯函式無論從那一方面來說,都是真正的函式。內聯函式與普通函式唯一不同的地方是它在適當的地方像巨集一樣展開,而不需要函式呼叫的開銷。

重要結論:任何在類中定義的函式自動成為內聯函式,但也可以在非類的函式前面加上inline關鍵字使之成為內聯函式。但必須在宣告和定義時同時註明inline關鍵字。如

inline int plusone(int x);

inline int plusone(int x)

編譯器將檢查函式引數列表使用是否正確,並返回值。這些事情是預處理器無法完成的。內聯函式的宣告一般放在標頭檔案裡面。

請記住:使用內聯函式的目的是減少函式呼叫開銷。但是如果函式較大,,由於需要在呼叫函式的每一處重複賦值**,這樣將使得**膨脹,在速度方面獲得的好處就會減少。

1、訪問函式

在類中內聯函式的最重要的使用之一就是訪問函式(access function)。這就是一般所謂的setter和getter函式,提供類中私有資料成員的訪問。如下:

class access

void set(int ii) };

int main()

第九章(筆記)

轉移指令是可以修改ip,或同時修改cs和ip的指令 offset 是用於提取標號偏移位址的操作符 jmp在第2章裡說到時用於修改ip或同時修改cs和ip的轉移指令,這章裡單獨的jmp指令是乙個無條件的轉移指令 jmp short 標號 是實現段內短轉移 jmp near ptr 標號 是實現段內近轉...

程式設計珠璣第九章

1 記憶體訪問 連續記憶體訪問與跨頁面訪問記憶體的區別 注意在訪問記憶體的時候,要注意記憶體的連續性,如果訪問的記憶體不是連續的,那麼程式的執行速度也會受到極大的影響 例如訪問乙個二維陣列時,先訪問行,再訪問列,能夠減少頁面排程次數,同時cache命中率也相對高些。2 遞迴呼叫巨集時,需要小心,巨集...

c 基礎 (第九章)

結構體型別說明 struct 結構體識別符號 成員變數列表 如果沒有結構體識別符號,則稱為無名結構體型別 引用結構體變數成員 l 結構體變數名.成員名 l 結構體指標名 成員名 l 結構體指標名 成員名 共用體共用體所有變數共用一塊記憶體 定義格式如下 union 共用體識別符號 成員變數列表 列舉...