1. 程式人生 > >在c++中普通函式與 行內函數的區別

在c++中普通函式與 行內函數的區別

我們都知道編譯的最終產品是可執行程式——— 由一組由機器語言指令組成,在執行程式時,作業系統將這些指令載入到計算機記憶體中。因此,每一組指令都有一個特定的記憶體地址。

一.普通函式的呼叫

a.當代碼執行到函式呼叫指令時,程式將在函式呼叫後立即儲存該指令的地址,同時將引數複製到堆疊中;

b.然後跳到標記函式起點的記憶體單元當中,執行函式程式碼,將返回值放回到暫存器當中;

c.跳回到地址被儲存的指令處

為了能夠對這個執行過程有更加明確的理解,我在這裡舉個例子:

比如我們在看一篇文章的時候,有個片語的意思我們不理解,這時候我們就需要會去看書下面給的註釋,在閱讀完註釋後我們就會很快的返回的當時正在閱讀的地方。這和普通函式在呼叫過程中的原理非常相似。

因此,在使用普通函式時由於需要來回跳轉所以它的執行速度比較慢,特別是需要呼叫很多次函式時。

二.行內函數的呼叫

1.如何才能使用行內函數?

a,在函式宣告前加上關鍵字 inline

b.在函式定義前加上關鍵字 inline

以上兩種方法任選其一即可。

2.呼叫原理

行內函數,顧名思義就是將編譯程式碼和其它程式碼 “內聯” 起來了。所以它在呼叫的時候是編譯器使用相應的函式程式碼替換函式呼叫。(這一點和巨集替換十分相似)

由於內聯程式碼在執行的時候程式無需進行來回的跳轉,所以它的執行速度相對於普通函式能快點;不過它也有自己的缺點,那就是對記憶體得耗損,如果程式需要在十個地方呼叫同一個行內函數,那這個程式將會將這個程式碼拷貝10次

下面我通過一張圖片來更加清楚的描述下普通函式和行內函數兩者的區別

                                                                   

相關推薦

c++普通函式 區別

我們都知道編譯的最終產品是可執行程式——— 由一組由機器語言指令組成,在執行程式時,作業系統將這些指令載入到計算機記憶體中。因此,每一組指令都有一個特定的記憶體地址。 一.普通函式的呼叫 a.當代碼執

C++巨集,普通函式的執行速度以及三者的差異

#include <boost/timer.hpp>#define  _SUM(x,y) x+yusing std::cout;using std::endl;using boost::timer;const int MAX_ARR_SIZE = 50000;i

含引數的巨集函式區別

含引數的巨集與函式的區別 1、巨集替換不佔執行時間,只佔編譯時間;而函式呼叫則佔執行時間(分配單元、保留現場、值傳遞、返回),每次執行都要載入,所以執行起來比較慢一些。 2、 定義巨集的時候不要在巨集及其引數之間鍵入空格,因為巨集替換的時候會把你不經意打的空格當作巨集的一部分進去

c/c++區別(一)函式的預設值 函式過載 c/c++介面呼叫 const在c/c++的區別

c/c++ 的區別 一.函式的預設值 在C語言裡函式的引數是不能夠帶預設值的。比如int func(int a, int b = 1);這樣的宣告就是不正確的。但是在C++中上述的宣告是被允許的   函式的預設引數值,即在定義引數的時候同時給它一個初始值。在呼叫函式的時候,

C++筆記 第六課 分析---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux 第六課 行內函數分析 1.C++中的const常量可以替代巨集常數定義 如: const int A

定義的成員函式

之前看書的時候沒有注意到這點,今天再翻primer發現了這句話,感覺好神奇,特意來做個筆記!在類內定義的成員函式預設為inline,不論前面是否加了inline,當然,是否內聯還是取決於編譯器啦~而在

C++簡單概念系列(

   C++語言博大精深,當然在博大的同時就有複雜的出現,最突出的就是概念多不容易弄明白。本人也是初學C++在此談點對一些概念的理解一來加深記憶,二來給各位看官做個參考。   文中我會以譚浩強教授的《C++面向物件程式設計》(《面》)和《C++Primer第三版》(《P》)為

C/C++之巨集、普通函式區別

轉載:https://www.cnblogs.com/ht-927/p/4726570.html C/C++之巨集、行內函數和普通函式的區別 行內函數的執行過程與帶引數巨集定義很相似,但引數的處理不同。帶引數的巨集定義並不對引數進行運算,而是直接替換;行內函數首先是函式,這就意味著函式的很多

普通函式有什麼區別

轉載 2007年12月25日 14:32:00 xiaoyan_cug 閱讀數:796  行內函數和普通函式相比可以加快程式的執行的速度,因為在呼叫行內函數時,不需要中斷,在編譯的時候直接將行內函數鑲嵌到目的碼中。內聯是以增加空間消耗為代價,換取時間開銷。巨集只是一種簡單

C++(inline)巨集定義

為什麼要使用行內函數呢? 當我們定義完一個函式之後,實際呼叫的時候,函式體本身會壓入堆疊,主函式再從堆疊裡面把這部分內容提取出來,產生一定的系統開銷,對於大型函式來說,這部分開銷可能相對於函式體本身執行的開銷來說微乎其微。但是如果一個函式僅僅只是為了完成一個特別簡單的功能,

c++函式的引數傳遞,和預設實參的理解

1.引數傳遞   1)函式呼叫時,c++中有三種傳遞方法:值傳遞、指標傳遞、引用傳遞。 給函式傳遞引數,遵循變數初始化規則。非引用型別的形參一相應的實參的副本初始化。對(非引用)形參的任何修改僅作用域區域性副本,並不影響實參本身。 為了避免傳遞副本的開銷,可將形參指定為引用型別。對引用形參的

個人C++速成筆記(1) -- C++C不一樣的地方:、預設引數、函式過載、函式模板、庫函式的呼叫

之前學過C,現在想稍微學習下C++,由於上班,只能利用平時的空閒時間學習,記錄一下學習歷程,激勵自己有始有終,部落格內容主要記錄C與C++不同的地方。                    

C++ 普通巨集的區別

巨集的使用:    因為函式的呼叫必須要將程式執行的順序轉移到函式所存放在記憶體中的某個地址,將函式的程式內容執行完後,再返回到轉去執行該函式前的地方。這種轉移操作要求在轉去執行前要儲存現場並記憶執行的地址,轉回後要恢復現場,並按原來儲存地址繼續執行。因此,函式呼叫要有一定

巨集、普通函式區別

行內函數是程式碼被插入到呼叫者程式碼處的函式。如同 #define 巨集,行內函數通過避免被呼叫的開銷來提高執行效率,尤其是它能夠通過呼叫(“過程化整合”)被編譯器優化。     行內函數和巨集很類似,而區別在於,巨集是由前處理器對巨集進行替代,而行內函數是通過編譯器控制來實現的。而且行內函數是真正的函式,只

4、【C++】靜態成員變數/靜態成員函式//友元函式/友元類/友元成員函式

一、靜態成員     我們可以使用 static 關鍵字來把類成員定義為靜態的。當我們宣告類的成員為靜態時,這意味著無論建立多少個類的物件,靜態成員都只有一個副本。     靜態成員在類的所有物件中是共享的。如果不存在其他的初始化語句,在建立第一個物件時,所有的靜態資料都會被初始化為

C++關鍵字、名稱空間、函式過載、預設引數、、引用

一 .C++入門 1.C++關鍵字 2.名稱空間 3.C++輸入&輸出 4.預設引數 5.函式過載 6.引用 7.行內函數 8.auto關鍵字 9.基於範圍的for迴圈 10.指標空值nullptr&nullptr_t 二. 正文 1.C++關鍵字(C++98)   

C++,預設引數和佔位引數

說明:裡面的示例程式碼有些被註釋掉了,想執行時要去掉註釋 #include "iostream" using namespace std; /**      內聯函數出現的原因:     C++中的const常量可以替代巨

C語言 inline帶參巨集

C語言 inline行內函數與帶參巨集 一、簡述         簡單的介紹inline行內函數、帶參巨集的作用。 二、函式的執行與呼叫         函式執行:會將之前的棧的頂,棧基址壓棧,並在棧中開

C++:名稱空間、預設引數、函式過載、引用、

一.名稱空間           在C/C++中,變數、函式和類都是大量存在的,這些變數、函式和類的名稱都將作用於全域性作用域中,可能會導致很多衝突,所以我們就選擇使用名稱空間。         &nb

c++ -inline

1. 引入inline關鍵字的原因 在c/c++中,為了解決一些頻繁呼叫的小函式大量消耗棧空間(棧記憶體)的問題,特別的引入了inline修飾符,表示為行內函數。 棧空間就是指放置程式的區域性資料(也就是函式內資料)的記憶體空間。 在系統下,棧空間是有限的,假如