C Primer中的陌生概念一 內聯函式

2021-07-24 23:42:06 字數 1579 閱讀 5102

內聯函式是c++有別於c的特性之一。是為了提高程式執行速度所做的一項改進。常規函式和內聯函式之間的主要區別不在於編寫方式,而在於c++編譯器如何將它們組合到程式中。要了解內聯函式與常規函式之間的區別,必須深入到程式內部。常規函式執行時,計算機總是在機器指令之間來回跳躍並記錄跳躍位置,這需要一定的開銷。c++內聯函式提供了另一種選擇,內聯函式的編譯**與其他程式**「內聯」起來了,編譯器將使用相應的函式**替換函式呼叫。對於內聯**,程式無需跳到另乙個位置執行**,再調回來。因此內聯函式的執行速度比常規函式稍快,但代價是需要占用更多記憶體。

我們編寫了乙個小函式:

const string &shorterstring(const string &s1, const string &s2)

它的功能是比較兩個string形參的長度並返回長度較小的string的引用。把這種規模較小的操作定義成函式有很多好處,主要包括:

1.閱讀和理解shorterstring函式的呼叫要比讀懂等價的條件表示式容易得多。

2.使用函式可以確保行為的統一,每次相關操作都能保證按照同樣的方式進行。

3.如果我們需要修改計算過程,顯然修改函式要比先找到等價表示式所有出現的地方再逐一修改更容易。

4.函式可以被其他應用重複利用,省去了程式設計師重新編寫的代價。

然而,使用shorterstring函式也存在乙個潛在的缺點:呼叫函式一般比求等價表示式的值要慢一些。在大多數機器上,一次函式呼叫其實包含著一系列工作:呼叫前要先儲存暫存器,並在返回時恢復;可能需要拷貝實參;程式轉向乙個新的位置繼續執行。

將函式指定為內聯函式(inline),就是將它在每個呼叫點上「內聯地」展開。假設我們把shorterstring函式定義成內聯函式,則如下呼叫:

cout << shorterstring(s1, s2) << endl;
將在編譯過程中展開成類似於下面的形式:

cout << s1.size() <= s2.size() ? s1 : s2 << endl;

測試**如下:

//#include "stdafx.h"

#include #include using namespace::std;

inline const string &shorterstring(const string &s1, const string &s2);

int main()

const string &shorterstring(const string &s1, const string &s2)

要使用內聯函式這項特性,必須採取下面的措施之一:

1)在函式宣告前加上關鍵字inline;

2)在函式定義前加上關鍵字inline;

通常做法是省略原型,將整個定義放在本應該提供原型的地方。

使用類時,函式定義位於類宣告中的函式將自動成為內聯函式。如果願意,也可以將類外定義的函式成為內聯函式。為此,只需在類實現部分中定義函式時使用inline限定符即可。但內聯函式的特殊規則要求在每個使用它們的檔案中都對其進行定義。確保內聯定義對多檔案程式中的所有檔案都可用的、最簡便的方法是:將內聯定義放在定義類的標頭檔案中。

C Primer中的陌生概念四 範圍for語句

範圍for語句是c 11 新標準引入的一種更為簡單的for語句,用於遍歷容器或其他序列的所有元素。如下面的例子 vector v for auto r v for語句頭宣告了迴圈控制變數r,並把它和v關聯在一起,我們使用關鍵字auto令編譯器為r指定正確的型別。需要注意的是,上面的語句相當於 for...

mysql中幾個有用的陌生語法

一.coalesce 函式 coalesce函式表示可以返回引數中的第乙個非空表示式,當你有n個引數時選取第乙個非空值 從左到右 例項一 返回結果 carrot 例項二 返回結果 1 這些語句可以直接在mysql裡執行。一 limit offset 語法 在我們使用查詢語句的時候,經常要返回前幾條或...

HBase內的基本概念

在搭建集群的時候,我們需要去了解hbase各個部分是做什麼的,否則一上來就找文章進行搭建,完全就是按著人家的做,而根本不知道自己在做什麼 hbase的部署結構主要分為master伺服器和regionserver伺服器,master也可以配置ha,即乙個活動節點,乙個備用節點,當活動節點掛掉,備用節點...