獨立式與宿主式實作
出自 cppreference.com
< cpp
C++ 標準定義了兩種實作方式:宿主式 (hosted) 與 獨立式 (freestanding) 實作。對於「宿主式」實作,C++ 標準所要求的標準函式庫標頭檔集合遠大於「獨立式」實作。在「獨立式」實作中,程式執行時可能不需要作業系統。
實作的類型由實作定義。 對於宿主式實作,巨集 __STDC_HOSTED__ 預定義為 1;對於獨立式實作,則預定義為 0。(C++11 起)
對 多執行緒執行與資料競爭 的要求
|
(C++11 起) |
[編輯] 對 main 函式的要求
| 獨立式 | 宿主式 |
|---|---|
| 在 獨立式 實作中,程式是否必須定義 main 函式由實作定義。啟動與終止機制由實作定義;啟動包含執行具有靜態儲存期之 命名空間範圍 物件的 建構函式;終止包含執行具有靜態 儲存期 物件的 解構函式。 | 在 宿主式 實作中,程式必須包含一個名為 main 的全域函式。執行程式會啟動一個主 執行執行緒,於其中呼叫 main 函式,並於該處初始化與銷毀具有靜態 儲存期 的變數。 |
[編輯] 對 標準函式庫標頭檔 的要求
獨立式 實作具有一組由實作定義的標頭檔。此集合至少包含下表中的標頭檔。
對於部分獨立式的標頭檔,獨立式實作僅需提供相應說明大綱中部分實體
- 若實體標註為 // freestanding,則保證提供。
|
(C++26 起) |
| 函式庫 | 元件 | 標頭檔 | 獨立式 |
|---|---|---|---|
| 語言支援 | 通用定義 | <cstddef> | 全部 |
| C 標準函式庫 | <cstdlib> | 部分 | |
| 實作屬性 | <cfloat> <climits> (C++11 起) <limits> <version> (C++20 起) |
全部 | |
| 整數類型 | <cstdint> (C++11 起) | 全部 | |
| 動態記憶體管理 | <new> | 全部 | |
| 類型識別 | <typeinfo> | 全部 | |
| 原始程式碼位置 | <source_location> (C++20 起) | 全部 | |
| 異常處理 | <exception> | 全部 | |
| 初始化列表 | <initializer_list> (C++11 起) | 全部 | |
| 比較運算 | <compare> (C++20 起) | 全部 | |
| 協程支援 | <coroutine> (C++20 起) | 全部 | |
| 其他執行時期支援 | <cstdarg> | 全部 | |
| 除錯支援 | <debugging> (C++26 起) | 全部 | |
| 概念 | <concepts> (C++20 起) | 全部 | |
| 診斷 | 錯誤編號 | <cerrno> (C++26 起) | 部分 |
| 系統錯誤支援 | <system_error> (C++26 起) | 部分 | |
| 記憶體管理 | 記憶體 | <memory> (C++23 起) | 部分 |
| 元編程 (Metaprogramming) | 型別特徵 | <type_traits> (C++11 起) | 全部 |
| 編譯期有理數運算 | <ratio> (C++23 起) | 全部 | |
| 通用公用程式 | 工具元件 | <utility> (C++23 起) | 全部 |
| 元組 (Tuples) | <tuple> (C++23 起) | 全部 | |
| 函式物件 | <functional> (C++20 起) | 部分 | |
| 基礎數值轉換 | <charconv> (C++26 起) | 部分 | |
| 位元操作 | <bit> (C++20 起) | 全部 | |
| 字串 | 字串類別 | <string> (C++26 起) | 部分 |
| 空終止 序列工具 |
<cstring> (C++26 起) <cwchar> (C++26 起) |
部分 | |
| 迭代器 | <iterator> (C++23 起) | 部分 | |
| 範圍 (Ranges) | <ranges> (C++23 起) | 部分 | |
| 數值 | 數學函式 針對浮點類型 |
<cmath> (C++26 起) | 部分 |
| 並行支援 (Concurrency support) | 原子 (Atomics) | <atomic> (C++11 起) | 全部[1] |
| 已棄用標頭檔 | <ciso646> (直到 C++20) <cstdalign> (C++11 起)(C++20 前) <cstdbool> (C++11 起)(C++20 前) |
全部 | |
- ↑ 在獨立式實作中,是否支援「永遠無鎖 (always lock-free)」的整數原子類型,以及是否存在類型別名 std::atomic_signed_lock_free 與 std::atomic_unsigned_lock_free,均由實作定義。(C++20 起)
[編輯] 附註
部分編譯器廠商可能未完全支援獨立式實作。例如,GCC 的 libstdc++ 在 13 版本之前存在實作與建構問題,而 LLVM 的 libcxx 與 MSVC 的 STL 則不支援獨立式。
在 C++23 中,許多特性透過部分標頭檔實現了獨立式支援。然而,WG21 仍在討論未來標準中是否將某些標頭檔納入獨立式支援。無論如何,像 vector、list、deque 與 map 這類容器,由於依賴異常處理與堆疊記憶體,永遠不會成為獨立式。
GCC 13 為獨立式環境提供了更多標頭檔,如 <optional>、<span>、<array> 與 <bitset>,儘管這些標頭檔可能不具備可攜性,或提供的功能與宿主式實作不盡相同。即便工具鏈提供了這些標頭檔,在獨立式環境中最好還是避免使用它們。
[編輯] 參考資料
- C++23 標準 (ISO/IEC 14882:2024)
- 4.1 實作合規性 [intro.compliance] (p: 10)
- 6.9.2 多執行緒執行與資料競爭 [intro.multithread] (p: 84)
- 6.9.3.1 main 函式 [basic.start.main] (p: 89)
- 16.4.2.5 獨立式實作 [compliance] (p: 483)
- C++20 標準 (ISO/IEC 14882:2020)
- 4.1 實作合規性 [intro.compliance] (p: 7)
- 6.9.2 多執行緒執行與資料競爭 [intro.multithread] (p: 77)
- 6.9.3.1 main 函式 [basic.start.main] (p: 82)
- 16.5.1.3 獨立式實作 [compliance] (p: 470)
- C++17 標準 (ISO/IEC 14882:2017)
- 4.1 實作合規性 [intro.compliance] (p: 5)
- 4.7 多執行緒執行與資料競爭 [intro.multithread] (p: 15)
- 6.6.1 main 函式 [basic.start.main] (p: 66)
- 20.5.1.3 獨立式實作 [compliance] (p: 458)
- C++14 標準 (ISO/IEC 14882:2014)
- 1.4 實作合規性 [intro.compliance] (p: 5)
- 1.10 多執行緒執行與資料競爭 [intro.multithread] (p: 11)
- 3.6.1 main 函式 [basic.start.main] (p: 62)
- 17.6.1.3 獨立式實作 [compliance] (p: 441)
- C++11 標準 (ISO/IEC 14882:2011)
- 1.4 實作合規性 [intro.compliance] (p: 5)
- 1.10 多執行緒執行與資料競爭 [intro.multithread] (p: 11)
- 3.6.1 main 函式 [basic.start.main] (p: 58)
- 17.6.1.3 獨立式實作 [compliance] (p: 408)
- C++03 標準 (ISO/IEC 14882:2003)
- 1.4 實作合規性 [intro.compliance] (p: 3)
- 3.6.1 main 函式 [basic.start.main] (p: 43)
- 17.4.1.3 獨立式實作 [lib.compliance] (p: 326)
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯應用於之前的 C++ 標準。
| DR | 應用於 | 出版時的行為 | 正確的行為 |
|---|---|---|---|
| CWG 1938 | C++98 | 實作不需要 記錄其是否為宿主式 |
將實作類型設為實作 定義(因此需要文件說明) |
| LWG 3653 (P1642R11) |
C++20 | <coroutine> 為獨立式,但 使用了 std::hash,該函式並未 |
被納入 <functional> 的部分獨立式中 |
[編輯] 參見
| C 文件 關於 合規性
|