動態繫結和靜態繫結

2021-10-20 19:16:34 字數 1431 閱讀 4663

繫結(binding)是指將變數和函式名轉換成位址的過程

絕大部分的順序執行邏輯中函式呼叫或某個確定資料型別的class型別的物件對成員呼叫都屬於靜態繫結

#include

using

namespace std;

class

employee

;class

teamper

:public employee

~teamper()

void

show()

size_t get_members()

};intmain()

靜態繫結意味著繫結的函式或變數,已經在編譯階段,該語句被編譯成"call函式位址「或」callq函式位址"這樣的彙編指令格式,並且這些彙編指令中的函式位址在程式編譯後是固定不變的,所有函式都有唯一的位址。因此,當編譯器遇到函式呼叫時,它將用機器語言指令替換該函式呼叫,該指令告訴cpu跳轉到該函式的位址,

在一些帶有決策性的業務邏輯的**中,要等到使用者的反饋(通常是條件判斷/引數型別判斷…),直到執行時,根據決策的結果才能知道將呼叫那個函式。這就是動態繫結,動態繫結的技術本源就是函式指標(也可以稱為函式原型)。在c++中執行時多型使用的就是函式指標。

函式指標是一種指向函式而不是變數的指標,可以通過使用指標上的函式呼叫運算子"()「或」(type1,type2,…)"的運算符號形式來呼叫函式指標指向的函式。

#include

using

namespace std;

int(

*one_)

(int n)

;inta1(

int n)

inta2

(int n)

intmain()

g =one_

(m);

cout << g << endl;

return0;

}

通過使用者的輸入的選項,將宣告函式指標指向要呼叫的函式,而不是直接呼叫具體的函式。編譯器無法使用靜態繫結來解析函式的呼叫。,因為它無法告訴函式指標在編譯時將指向那個函式(a1還是a2?)

動態繫結的效能問題

動態繫結的效率稍低,因為它涉及到額外的間接訪問。通過靜態繫結cpu可以直接跳轉到函式的位址,但是對於動態繫結來說,因為涉及cpu和暫存器儲存/載入一系列指令,程式必須讀取指標中儲存的位址,然後跳轉到該位址。使其速度變慢。動態繫結的優點是在於它比靜態繫結靈活,不需要在編譯時就決定要呼叫什麼函式。

在c++物件導向多型時,尤其是執行時多型即動態繫結,編譯時多型即靜態繫結

C 動態繫結和靜態繫結

學習大佬的總結 為了支援c 的多型性,才用了動態繫結和靜態繫結。理解他們的區別有助於更好的理解多型性,以及在程式設計的過程中避免犯錯誤。需要理解四個名詞 1 物件的靜態型別 物件在宣告時採用的型別。是在編譯期確定的。2 物件的動態型別 目前所指物件的型別。是在執行期決定的。物件的動態型別可以更改,但...

c 動態繫結和靜態繫結

為了支援c 的多型性,才用了動態繫結和靜態繫結。1 物件的靜態型別 物件在宣告時採用的型別。是在編譯期確定的。2 物件的動態型別 目前所指物件的宣告。在執行期決定。物件的動態型別可以更改,但是靜態型別無法更改。關於物件的靜態型別和動態型別,看乙個示例 class a class b public a...

C 的動態繫結和靜態繫結

定義 1 物件的靜態型別 物件在宣告時採用的型別。是在編譯期確定的。2 物件的動態型別 目前所指物件的型別。是在執行期決定的。物件的動態型別可以更改,但是靜態型別無法更改。eg.class b class c public b class d public b d pd new d pd的靜態型別是...