每個 `.cpp` 為一編譯單元。全局視角只見聲明/定義:變量(佔內存,存全局區)、函數體(指令,存代碼區)、類定義(編譯期類型檢查,運行期不存在)。編譯器掃描構建符號表:符號名、類型(內存佈局/初始化)、內容(數據/代碼地址)。局部掃描做符號消解(本單元聲明/符號表查找)與語法檢查,未聲明報錯。翻譯階段將符號替換為地址/偏移,生成 `.obj`(指令碼)和符號表。
掃描所有 `.obj`,用符號表填充「問號」符號(外部引用)。合併代碼段形成大代碼段,合併數據段形成大數據段(全局變量連續佈局)。生成 `.exe`:代碼區 + 數據區。
OS 載入 `.exe`:分配代碼區、數據區(全局/靜態/常量)、棧區、堆區。入口點 `_start` → 初始化運行時 → `main`。此時類已「消失」,只剩函數指令與數據佈局。
單次編譯無鏈接。`import` 僅為符號添加包名前綴(全限定名)。生成 `.class` 文件,含字節碼、常量池、符號引用(字符串形式)。
啟動類(含 `main`)先加載。首次主動使用類(`new`、靜態字段/方法、`Class.forName`、子類初始化)觸發加載:雙親委派模型 → 字節碼驗證 → 準備(靜態字段賦零值) → 解析(符號引用→直接引用) → 初始化(`
每類一 `.class` 文件,便於類加載器按全限定名(包名轉路徑)定位。`public` 類強制文件同名,編譯期預加載提速(被多處引用)。非 `public` 類按需加載。
導出符號(函數/變量/類成員)以修飾名導出。`__declspec(dllexport)` 類導出所有成員。本質:共享代碼段 + 共享/進程私有數據段。運行期 `LoadLibrary`/`GetProcAddress` 解析符號地址。
多類打包為 `.dll`(程序集),含清單(元數據)。編譯期引用程序集解析符號 → 運行期按程序集名+命名空間+類名動態加載。`using` = `import` = 符號前綴。
C++:靜態編譯鏈接,極致性能,手動內存,無運行期類。Java:動態類加載,豐富運行時(GC、反射、JIT),安全沙箱。C#:程序集粒度動態加載,融合兩者優點。理解本質差異,才能跨語言架構設計、性能調優、疑難排查。