1. 程式人生 > >虛擬函式能否是行內函數

虛擬函式能否是行內函數

行內函數是在編譯時,將呼叫函式處插入行內函數的程式碼,省去了函式呼叫時的開銷。
虛擬函式是通過指標或引用呼叫函式時,通過虛擬函式表來確定呼叫的函式,在執行時確定。
那麼虛擬函式是否可以是行內函數?
以前沒有想過這個問題,表面上看,虛擬函式不能為行內函數。我們在類中定義的函式都是行內函數,解構函式經常在類中定義,而解構函式又經常宣告為虛擬函式,以前沒有發現什麼問題。

其實虛擬函式可以為行內函數,這與行內函數的定義沒什麼衝突。

行內函數到底要不要在呼叫處展開取決於怎麼呼叫行內函數。看下面的例子: 

class A{
	public:
	A():x(10){}
	virtual void print()
	{
		cout<<x<<endl;
	}
	private:
	int x;
} ;
如果
A a;
a.print();
那麼就會展開為行內函數。

如果

A a;
A *p=&a;
p->print();
那麼就通過虛擬函式表呼叫,不會展開。


相關推薦

含引數的巨集與函式的區別

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

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

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

在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

定義的成員函式

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

虛擬函式能否

行內函數是在編譯時,將呼叫函式處插入行內函數的程式碼,省去了函式呼叫時的開銷。 虛擬函式是通過指標或引用呼叫函式時,通過虛擬函式表來確定呼叫的函式,在執行時確定。 那麼虛擬函式是否可以是行內函數? 以

C++語言特性:建構函式,解構函式,虛擬函式,,靜態成員函式,過載,覆蓋,隱藏

C++中class預設屬性為private, struct預設屬性為public 建構函式:        1.初始化物件成員;        2.建立類物件;        由於虛擬函式是建立在物件的基礎上的,因此建構函式不能宣告為虛擬函式;虛擬函式是在執行的時候才識別,

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

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

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

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

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

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

Python函式細節:多數量引數、強制引數傳遞、返回多值、匿名/

1. 可接受任意數量引數的函式 接受任意數量的位置引數,使用引數*來解決 # rest是由所有其他位置引數組成的元組 def avg(first, *rest): return ( first + sum(rest) ) / (1+len(rest)) pri

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

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

與普通函式有什麼區別

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

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

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

c++——函式特性,函式過載,簡單解釋

有預設引數值的引數必須在引數表的最右端 正確示例 void fun(int i;int j=1;int k=10); 錯誤示例 void fun(int i;int j=1;int k); 一般編譯器通過率高的是: 宣告寫預設值;定義不寫預設值 如下示例:

c++ 和constexper函式

行內函數 將函式宣告行內函數, 通常是在編譯器, 將它在呼叫點將函式“內聯展開”。 inline int len(const string& str) { return st

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

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

函式過載

行內函數   巨集可以避免函式呼叫帶來的開銷,但存在兩個問題:1)巨集沒有作用域,沒有型別檢測,另外定義巨集時,需要時刻注意加括號,除此之外,當傳入變數自增時,會出現不可避免的錯誤。2)C++中巨集不能作為類的成員函式,因為前處理器不能訪問類成員。   行內函數主要為了替代巨集,另外,類中的成員函式預設加

預設引數,函式過載,引用,...

目錄 預設引數 (預設引數) 函式過載 引用 常引用 行內函數 基於範圍的for迴圈 指標空值---nullptr 預設引數 (預設引數)          定義:指當函式呼叫中省略了實引數時自動使用的一個值。

函式的預設值,函式過載

函式預設值 c++在函式方面比c多了個預設值,實際是當給函式不傳引數是該函式就會使用預設值對引數進行賦值,當然預設值是從右向左依次賦值 void sum(int a,int b=2,int c=3) {} int main() { sum(1);//因為a無預設值,所以要傳引數 } 函式預設