フリースタンディング実装とホスト実装
C++標準では、ホスト (hosted) と フリースタンディング (freestanding) の2種類の実装が定義されています。ホスト実装では、C++標準で要求される標準ライブラリヘッダのセットが、フリースタンディング実装よりもはるかに大規模です。フリースタンディング実装では、オペレーティングシステムなしで実行されることがあります。
実装の種類は処理系定義です。ホスト実装ではマクロ __STDC_HOSTED__ が 1 に、フリースタンディング実装では 0 に事前定義されます。(C++11 から)
マルチスレッド実行とデータ競合に関する要件
|
(C++11以降) |
[編集] main 関数に関する要件
| フリースタンディング | ホスト |
|---|---|
| フリースタンディング実装では、プログラムがmain関数を定義する必要があるかどうかは処理系定義です。起動と終了は処理系定義です。起動時には静的記憶域期間を持つ名前空間スコープのオブジェクトのコンストラクタが実行され、終了時には静的記憶域期間を持つオブジェクトのデストラクタが実行されます。 | ホスト実装では、プログラムはmainという名前のグローバル関数を含まなければなりません。プログラムを実行すると、main関数が呼び出されるメイン実行スレッドが開始され、その中で静的記憶域期間を持つ変数が初期化・破棄されることがあります。 |
[編集] 標準ライブラリヘッダに関する要件
フリースタンディング実装は、処理系定義のヘッダのセットを持ちます。このセットには、少なくとも以下の表にあるヘッダが含まれます。
部分的にフリースタンディングなヘッダについて、フリースタンディング実装は対応する概要(synopsis)にある実体の一部を提供するだけでよいとされています。
- 実体に // 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 から) | 部分的 |
| メタプログラミング | 型特性 | <type_traits> (C++11 から) | 全て |
| コンパイル時有理数演算 | <ratio> (C++23 から) | 全て | |
| 汎用ユーティリティ | ユーティリティコンポーネント | <utility> (C++23 から) | 全て |
| タプル | <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 から) | 部分的 |
| 並行性サポート | アトミック操作 | <atomic> (C++11 から) | 全て[1] |
| 非推奨のヘッダ | <ciso646> (C++20 まで) <cstdalign> (C++11 から)(C++20 まで) <cstdbool> (C++11 から)(C++20 まで) |
全て | |
- ↑ 常時ロックフリーな整数アトミック型のサポートと、型エイリアス 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 Implementation compliance [intro.compliance] (p: 10)
- 6.9.2 Multi-threaded executions and data races [intro.multithread] (p: 84)
- 6.9.3.1 main function [basic.start.main] (p: 89)
- 16.4.2.5 Freestanding implementations [compliance] (p: 483)
- C++20 standard (ISO/IEC 14882:2020)
- 4.1 Implementation compliance [intro.compliance] (p: 7)
- 6.9.2 Multi-threaded executions and data races [intro.multithread] (p: 77)
- 6.9.3.1 main function [basic.start.main] (p: 82)
- 16.5.1.3 Freestanding implementations [compliance] (p: 470)
- C++17 standard (ISO/IEC 14882:2017)
- 4.1 Implementation compliance [intro.compliance] (p: 5)
- 4.7 Multi-threaded executions and data races [intro.multithread] (p: 15)
- 6.6.1 main function [basic.start.main] (p: 66)
- 20.5.1.3 Freestanding implementations [compliance] (p: 458)
- C++14 standard (ISO/IEC 14882:2014)
- 1.4 Implementation compliance [intro.compliance] (p: 5)
- 1.10 Multi-threaded executions and data races [intro.multithread] (p: 11)
- 3.6.1 Main function [basic.start.main] (p: 62)
- 17.6.1.3 Freestanding implementations [compliance] (p: 441)
- C++11 standard (ISO/IEC 14882:2011)
- 1.4 Implementation compliance [intro.compliance] (p: 5)
- 1.10 Multi-threaded executions and data races [intro.multithread] (p: 11)
- 3.6.1 Main function [basic.start.main] (p: 58)
- 17.6.1.3 Freestanding implementations [compliance] (p: 408)
- C++03 標準 (ISO/IEC 14882:2003)
- 1.4 Implementation compliance [intro.compliance] (p: 3)
- 3.6.1 Main function [basic.start.main] (p: 43)
- 17.4.1.3 Freestanding implementations [lib.compliance] (p: 326)
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| CWG 1938 | C++98 | 実装がホスト実装であるかどうかを 文書化する必要がなかった |
実装の種類を処理系定義とした (これにより文書化が要求される) |
| LWG 3653 (P1642R11) |
C++20 | <coroutine>はフリースタンディングだが、 そうではなかったstd::hashを使用していた |
<functional>を 部分的にフリースタンディングにした |
[編集] 関連項目
| C言語ドキュメントの適合性
|