フリースタンディング処理系とホスト処理系
ホスト処理系とフリースタンディング処理系の2種類の処理系が C++ 標準によって定義されています。 ホスト処理系に対して C++ 標準が要求する標準ライブラリヘッダの集合はフリースタンディング処理系に対するものよりも大きなものです。 フリースタンディング処理系では実行はオペレーティングシステムなしで行われる場合もあります。
マルチスレッド実行およびデータ競合に対する要件
|
(C++11以上) |
[編集] main 関数に対する要件
フリースタンディング (中国語:独立) | ホスト (中国語:宿主) |
---|---|
フリースタンディング処理系では、プログラムが main 関数を定義しなければならないかどうかは処理系定義です。 スタートアップおよび終了は処理系定義です。 スタートアップには静的記憶域期間を持つ名前空間スコープのオブジェクトに対するコンストラクタの実行が含まれます。 終了には静的記憶域期間を持つオブジェクトに対するデストラクタの実行が含まれます。 | ホスト処理系では、プログラムは main という名前のグローバル関数を含まなければなりません。 プログラムを実行すると main 関数を呼び出すメインスレッドを開始します。 メインスレッドでは静的記憶域期間を持つ変数の初期化と破棄も行われます。
|
[編集] 標準ライブラリヘッダに対する要件
フリースタンディング処理系は処理系定義のヘッダの集合を持ちますが、この集合には少なくとも以下の表のヘッダが含まれます。
型 | <cstddef> |
処理系の性質 | <limits> <cfloat> <climits> (C++11以上) <version> (C++20以上) |
整数型 | <cstdint> (C++11以上) |
開始と終了 | <cstdlib> (一部)[1] |
動的メモリ管理 | <new> |
型識別 | <typeinfo> |
ソース位置 | <source_location> (C++20以上) |
例外処理 | <exception> |
初期化子リスト | <initializer_list> (C++11以上) |
比較 | <compare> (C++20以上) |
コルーチンサポート | <coroutine> (C++20以上) |
その他の実行時サポート | <cstdarg> |
基礎ライブラリコンセプト | <concepts> (C++20以上) |
型特性 | <type_traits> (C++11以上) |
ビット操作 | <bit> (C++20以上) |
アトミック | <atomic> (C++11以上)[2] |
ユーティリティコンポーネント | <utility> (C++23以上) |
タプル | <tuple> (C++23以上) |
メモリ | <memory> (C++23以上) (一部) |
関数オブジェクト | <functional> (C++23以上) (一部) |
コンパイル時の有理演算 | <ratio> (C++23以上) |
イテレータライブラリ | <iterator> (C++23以上) (一部) |
範囲ライブラリ | <ranges> (C++23以上) (一部) |
非推奨のヘッダ | <ciso646> <cstdalign> <cstdbool> (C++11以上)(C++20未満) |
- ↑ ヘッダ
<cstdlib>
の供給されるバージョンは少なくとも関数 std::abort、 std::atexit、 std::exit、 std::at_quick_exit および std::quick_exit (C++11以上) を宣言しなければなりません。 - ↑ フリースタンディング処理系では常にロックフリーな整数アトミック型のサポートおよび型エイリアス std::atomic_signed_lock_free および std::atomic_unsigned_lock_free の存在は処理系定義です。 (C++20以上)
[編集] ノート
重要なことは、一部のコンパイラベンダーがフリースタンディングの実装を完全にサポートしない場合があることです。例えば、GCC libstdc++はバージョン13以前に実装上の問題やビルド上の問題があり、一方でLLVM libcxxやMSVC STLはフリースタンディングをサポートしていません。
C++23では、多くの機能が部分ヘッダーを用いてフリースタンディングになります。しかし、<array>のようなヘッダーが将来の標準(C++26かもしれない)でフリースタンディングになるかどうかは、WG21で議論されています。それでも、例外とヒープに依存しているため、vector、list、deque、mapのようなコンテナは常にフリースタンディングになりません。
GCC 13では、freestandingに必要なoptional、span、array、bitsetなどのヘッダーが追加されました。しかし、これらのヘッダーはポータブルでない場合があるため、ホスト環境と同じ体験を提供しない場合があります。ツールチェーンがこれらのヘッダーを提供していても、フリースタンディング環境では使用しない方が良いです。
[編集] 参考文献
- 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 standard (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 | C++20 | <coroutine> はフリースタン ディングだが、std::hash を使用する |
<functional> が部分的にフ リースタンディングでC++23 で修正された |
[編集] 関連項目
準拠 の C言語リファレンス
|