連結期,又稱linkage,控制著對象的可見性。
它和作用域(scope)的區別是:作用域決定了在同一個編譯單元(包含頭檔案以後的源檔案)中該對象的可見性。而連結期決定了跨多個編譯單元時對象的可見性。
基本介紹
- 中文名:連結期
- 外文名:link time
- 性質:控制著對象的可見性
- 相關概念:編譯期、運行期
- 學科:計算機科學
概述
程式在連結期執行的操作
連結程式靜態地建立函式之間的連結,即在程式執行之前建立組成程式的源檔案中所包含的函式連結。
動態程式庫有幾個重要的優點:一個主要的優點是動態程式庫中的函式可以在幾個並行執行的程式之間共享,這將節省相同函式占用的記憶體空間。另一個優點是動態程式庫在調用其中的函式之前是不會載入到記憶體中的。也就是說,如果不使用給定動態程式庫中的函式,該動態程式庫就不會占用記憶體空間。
舉例
(1)從靜態存儲區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個運行期間都存在。例如全局變數,static變數。
(2)在棧上創建。在執行函式時,函式內局部變數的存儲單元都可以在棧上創建,函式執行結束時這些存儲單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。
(3)從堆上分配,亦稱動態記憶體分配。程式在運行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。
static關鍵字對對象連結期的影響
// A.cpp// External linkage by defaultint i = 10;// Internal linkagestatic int j = 10;// B.cppextern int i;extern int j;int main(){int x = i;// Link eror below! Unresolved external symbol "j".// int y = j;}
// namespace scope class// MyClass.hclass MyClass{public:// No linkageint m_i;// External linkage!static int m_j;};// MyClass.cpp#include "MyClass.h"int MyClass::m_j = 10;// Another.cpp#include "MyClass.h"int main(){MyClass::m_j = 20;// Compile error below!// m_i = 1;// MyClass::m_i = 1;}