Freestanding and hosted implementations
C++標準で定義される実装には2種類あります: ホスト環境 と フリースタンディング環境 です。 ホスト環境 の場合、C++標準で要求される標準ライブラリヘッダーのセットは フリースタンディング環境 よりもはるかに多くなります。 フリースタンディング環境 では、オペレーティングシステムなしで実行が行われる可能性があります。
実装の種類は実装定義である。
定義済みマクロ
__STDC_HOSTED__
はホスト環境実装では
1
に展開され、フリースタンディング実装では
0
に展開される。
(C++11以降)
マルチスレッド実行とデータ競合 に関する要件
|
(C++11以降) |
main 関数に対する要件
| freestanding | hosted |
|---|---|
| freestanding 実装では、プログラムが main 関数を定義する必要があるかどうかは実装定義である。開始と終了は実装定義であり、開始時には静的記憶域期間を持つ 名前空間スコープ のオブジェクトの コンストラクタ の実行が含まれ、終了時には静的 記憶域期間 を持つオブジェクトの デストラクタ の実行が含まれる。 |
hosted
実装では、プログラムはグローバル関数
main
を含まなければならない。プログラムの実行は
main
関数が呼び出されるメインの
実行スレッド
を開始し、その中で静的
記憶域期間
を持つ変数が初期化および破棄される可能性がある。
|
標準ライブラリヘッダー に対する要件
freestanding 実装は、実装定義のヘッダーセットを持ちます。このセットには、少なくとも以下の表のヘッダーが含まれます。
部分的にフリースタンディングなヘッダーについては、フリースタンディング実装は対応するシンopsisに記載されているエンティティの一部のみを提供すれば十分です:
- エンティティがコメントされている場合 // freestanding 、その提供が保証されています。
|
(C++26以降) |
- エンティティが、その概要が all freestanding または // mostly freestanding で始まるヘッダーで宣言されている場合、エンティティ自体がコメントアウトされていない限り、その提供が保証されます。
フリースタンディング実装に必要なヘッダー
| ライブラリ | コンポーネント | ヘッダー | フリースタンディング |
|---|---|---|---|
| Language support | 共通定義 | <cstddef> | All |
| 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 | <concepts> (C++20以降) | すべて | |
| 診断 | エラー番号 | <cerrno> (C++26以降) | 部分的 |
| システムエラーサポート | <system_error> (C++26以降) | Partial | |
| メモリ管理 | メモリ | <memory> (C++23以降) | 部分的 |
| メタプログラミング | 型特性 | <type_traits> (C++11以降) | すべて |
| コンパイル時有理数演算 | <ratio> (C++23以降) | すべて | |
| 汎用ユーティリティ | ユーティリティコンポーネント | <utility> (C++23以降) | すべて |
| タプル | <tuple> (since C++23) | All | |
| 関数オブジェクト | <functional> (C++20以降) | 部分的 | |
| プリミティブ数値変換 | <charconv> (C++26以降) | 部分的 | |
| ビット操作 | <bit> (since C++20) | All | |
| 文字列 | 文字列クラス | <string> (C++26以降) | 部分的 |
|
ヌル終端
シーケンスユーティリティ |
<cstring> (C++26以降) | 部分的 | |
| テキスト処理 |
ヌル終端
シーケンスユーティリティ |
<cwchar> (C++26以降) | 部分的 |
| イテレータ | <iterator> (C++23以降) | 部分的 | |
| 範囲 | <ranges> (C++23以降) | 部分的 | |
| 数値演算 |
浮動小数点型のための
数学関数 |
<cmath> (C++26以降) | 部分的 |
| 乱数生成 | <random> (C++26以降) | 部分的 | |
| 並行性サポート | アトミック操作 | <atomic> (C++11以降) | すべて [1] |
| 実行制御 | <execution> (C++26以降) | 部分的 | |
| 非推奨 ヘッダー |
<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 実装の適合性 [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 documentation
for
Conformance
|
|
C documentation
for
Conformance
|