名前空間
変種
操作

フリースタンディング実装とホスト実装

From cppreference.com
< cpp

C++標準では、ホスト (hosted)フリースタンディング (freestanding) の2種類の実装が定義されています。ホスト実装では、C++標準で要求される標準ライブラリヘッダのセットが、フリースタンディング実装よりもはるかに大規模です。フリースタンディング実装では、オペレーティングシステムなしで実行されることがあります。

実装の種類は処理系定義です。ホスト実装ではマクロ __STDC_HOSTED__1 に、フリースタンディング実装では 0 に事前定義されます。(C++11 から)

目次

マルチスレッド実行とデータ競合に関する要件

フリースタンディング ホスト
フリースタンディング実装では、プログラムが複数の実行スレッドを持てるかどうかは処理系定義です。 ホスト実装では、C++プログラムは複数のスレッドを並行して実行できます。
(C++11以降)

[編集] main 関数に関する要件

フリースタンディング ホスト
フリースタンディング実装では、プログラムがmain関数を定義する必要があるかどうかは処理系定義です。起動と終了は処理系定義です。起動時には静的記憶域期間を持つ名前空間スコープのオブジェクトのコンストラクタが実行され、終了時には静的記憶域期間を持つオブジェクトのデストラクタが実行されます。 ホスト実装では、プログラムはmainという名前のグローバル関数を含まなければなりません。プログラムを実行すると、main関数が呼び出されるメイン実行スレッドが開始され、その中で静的記憶域期間を持つ変数が初期化・破棄されることがあります。

[編集] 標準ライブラリヘッダに関する要件

フリースタンディング実装は、処理系定義のヘッダのセットを持ちます。このセットには、少なくとも以下の表にあるヘッダが含まれます。

部分的にフリースタンディングなヘッダについて、フリースタンディング実装は対応する概要(synopsis)にある実体の一部を提供するだけでよいとされています。

  • 実体に // freestanding というコメントが付いている場合、それが提供されることが保証されます。
  • 実体(関数または関数テンプレート)に // freestanding-deleted というコメントが付いている場合、それが提供されるか、あるいは削除(deleted)されるかのどちらかであることが保証されます。
(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 まで)
全て
  1. 常時ロックフリーな整数アトミック型のサポートと、型エイリアス std::atomic_signed_lock_free および std::atomic_unsigned_lock_free の存在は、フリースタンディング実装では処理系定義です。(C++20 から)

[編集] ノート

一部のコンパイラベンダーは、フリースタンディング実装を完全にはサポートしていない可能性があります。例えば、GCCのlibstdc++はバージョン13以前に実装とビルドの問題がありましたが、LLVMのlibcxxとMSVCのSTLはフリースタンディングをサポートしていません。

C++23では、多くの機能が部分的なヘッダと共にフリースタンディングになりました。しかし、将来の標準でどのヘッダがフリースタンディングになるかについては、WG21でまだ議論中です。いずれにせよ、vectorlistdequemapのようなコンテナは、例外とヒープへの依存関係のため、決してフリースタンディングにはなりません。

GCC 13は、<optional><span><array><bitset>など、より多くのヘッダをフリースタンディング用に提供しています。しかし、これらのヘッダはポータブルでなかったり、ホスト実装と同じ機能を提供しなかったりする可能性があります。ツールチェインが提供していても、フリースタンディング環境での使用は避けるのが賢明です。

機能テストマクロ 規格 機能
__cpp_lib_freestanding_feature_test_macros 202306L (C++26) フリースタンディング機能テストマクロ
__cpp_lib_freestanding_algorithm 202311L (C++26) フリースタンディング <algorithm>
__cpp_lib_freestanding_array 202311L (C++26) フリースタンディング <array>
__cpp_lib_freestanding_char_traits 202306L (C++26) フリースタンディング std::char_traits
__cpp_lib_freestanding_charconv 202306L (C++26) フリースタンディング <charconv>
__cpp_lib_freestanding_cstdlib 202306L (C++26) フリースタンディング <cstdlib>
__cpp_lib_freestanding_cstring 202311L (C++26) フリースタンディング <cstring>
__cpp_lib_freestanding_cwchar 202306L (C++26) フリースタンディング <cwchar>
__cpp_lib_freestanding_errc 202306L (C++26) フリースタンディング std::errc
__cpp_lib_freestanding_expected 202311L (C++26) フリースタンディング <expected>
__cpp_lib_freestanding_functional 202306L (C++26) フリースタンディング <functional>
__cpp_lib_freestanding_iterator 202306L (C++26) フリースタンディング <iterator>
__cpp_lib_freestanding_mdspan 202311L (C++26) フリースタンディング <mdspan>
__cpp_lib_freestanding_memory 202306L (C++26) フリースタンディング <memory>
__cpp_lib_freestanding_numeric 202311L (C++26) フリースタンディング <numeric>
__cpp_lib_freestanding_optional 202311L (C++26) フリースタンディング <optional>
__cpp_lib_freestanding_ranges 202306L (C++26) フリースタンディング <ranges>
__cpp_lib_freestanding_ratio 202306L (C++26) フリースタンディング <ratio>
__cpp_lib_freestanding_string_view 202311L (C++26) フリースタンディング <string_view>
__cpp_lib_freestanding_tuple 202306L (C++26) フリースタンディング <tuple>
__cpp_lib_freestanding_utility 202306L (C++26) フリースタンディング <utility>
__cpp_lib_freestanding_variant 202311L (C++26) フリースタンディング <variant>

[編集] 参照

  • 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>
部分的にフリースタンディングにした

[編集] 関連項目

English 日本語 中文(简体) 中文(繁體)