2014-10-04 104 views
3

我正在閱讀有關這兩件事情,並感到困惑,兩者之間有什麼區別?鏈接和綁定有什麼區別?

+0

您是否試過尋找答案。這裏是https://www.google.co.in/?gfe_rd=cr&ei=Nf4vVObDKqLM8gedwIHIBg#q=What+is+the+difference+between+linking+and+binding – Rahul 2014-10-04 14:04:30

回答

0

假設你有一個函數聲明爲:

void f(int, char); 

,也可以作爲:

void f(int); 

你調用函數f(4)正確的簽名。這是綁定。 鏈接器將與函數體的可用定義鏈接,用於與簽名void f(int)進行f匹配;

3

綁定是一個在多個上下文中使用的單詞。然而,當綁定行爲發生變化時,它始終與一個事物與另一個事物的連接有關。

有一個綁定時間的概念或某個組件綁定到某個其他組件的點。綁定時間的基本列表是:(1)在編譯時綁定,(2)在鏈接時綁定,(3)在加載時綁定,以及(4)在運行時綁定。

編譯時的綁定發生在源代碼編譯時。對於C/C++,有兩個主要階段,預處理器執行源文本替換,如定義替換或宏替換,以及彙編將源文本轉換爲機器代碼的源文本以及鏈接器的必要指令。

鏈接時的綁定是當外部符號鏈接到一組特定的目標文件和庫時。您可能有幾個不同的靜態庫具有相同的函數名稱集,但函數的實際實現是不同的。所以你可以通過選擇不同的靜態庫來選擇使用哪個庫實現。

加載時的綁定是加載器將可執行文件與任何動態或共享庫一起加載到內存中的時間。加載器將函數調用綁定到特定的動態庫或共享庫,並且所選庫可能會有所不同。

運行時綁定是程序實際運行時根據當前執行線程作出選擇。

所以連接實際上只是綁定的一種類型。看看這個提供更多關於鏈接和庫信息的stackoverflow static linking vs dynamic linking

您可能也有興趣std::bind在C++中,所以這裏是一個stackoverflow文章std::function and std::bind what are they when they should be used

在某些東西被綁定到其他東西之前,您等待的時間越長,可以爲軟件的使用方式提供所需程度的靈活性。然而,在延遲綁定和運行時效率以及源代碼的複雜性之間經常存在折衷。

有關綁定時間的示例,請考慮打開文件並從文件讀取然後關閉該文件的應用程序。當文件名被綁定到打開的文件時,您可以選擇幾個不同的時間。

您可能會在編譯時對文件名進行硬編碼,這意味着它只能與該文件一起使用。要更改文件名稱,您必須更改源文件並重新編譯。

您可能必須通過用戶輸入的文件名,如與用戶提示或命令行參數,文件名綁定到該文件在運行時開放。要更改文件名稱不再需要重新編譯,只需使用不同的文件名再次運行該程序。

0

實際上它們在c編程中都有相同的含義。有些人使用綁定,其他人使用鏈接。

如果你想知道鏈接是什麼,那麼這裏是一個簡短的解釋。

假設你已經做了一個用戶定義的函數調用的總和(),其聲明是根據 INT總和(INT,INT);然後每當從程序調用函數時,程序應該知道在內存中跳轉到何處執行該函數。簡單地說,函數的地址應該被你的程序知道,以便到達它的被稱爲綁定的主體。

現在sum是用戶定義的函數,所以它會出現在你的源代碼中。如果它從main()被調用,那麼它將在編譯時被鏈接到main,因爲那時編譯器會知道你的函數在可執行文件中的位置。這稱爲靜態綁定。

現在想想printf()這是庫函數,它的主體不在你的程序中。所以編譯程序時,printf的主體將不會出現在您的編譯可執行文件中。當你執行你的程序時,它將被加載到內存中,並且它的地址在運行時會被main所知,而不是在sum()的情況下在編譯時被知道。這種類型的鏈接稱爲動態鏈接。

相關問題