Namespaces
Variants

Freestanding and hosted implementations

From cppreference.net

C++標準で定義される実装には2種類あります: ホスト環境 フリースタンディング環境 です。 ホスト環境 の場合、C++標準で要求される標準ライブラリヘッダーのセットは フリースタンディング環境 よりもはるかに多くなります。 フリースタンディング環境 では、オペレーティングシステムなしで実行が行われる可能性があります。

実装の種類は実装定義である。 定義済みマクロ __STDC_HOSTED__ はホスト環境実装では 1 に展開され、フリースタンディング実装では 0 に展開される。 (C++11以降)

目次

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

freestanding hosted
freestanding 実装では、プログラムが複数の 実行スレッド を持つことができるかどうかは実装定義である。 hosted 実装では、C++プログラムは複数の スレッド を同時に実行することができる。
(C++11以降)

main 関数に対する要件

freestanding hosted
freestanding 実装では、プログラムが main 関数を定義する必要があるかどうかは実装定義である。開始と終了は実装定義であり、開始時には静的記憶域期間を持つ 名前空間スコープ のオブジェクトの コンストラクタ の実行が含まれ、終了時には静的 記憶域期間 を持つオブジェクトの デストラクタ の実行が含まれる。 hosted 実装では、プログラムはグローバル関数 main を含まなければならない。プログラムの実行は main 関数が呼び出されるメインの 実行スレッド を開始し、その中で静的 記憶域期間 を持つ変数が初期化および破棄される可能性がある。

標準ライブラリヘッダー に対する要件

freestanding 実装は、実装定義のヘッダーセットを持ちます。このセットには、少なくとも以下の表のヘッダーが含まれます。

部分的にフリースタンディングなヘッダーについては、フリースタンディング実装は対応するシンopsisに記載されているエンティティの一部のみを提供すれば十分です:

  • エンティティがコメントされている場合 // freestanding 、その提供が保証されています。
  • エンティティ(関数または関数テンプレート)が // freestanding-deleted とコメントされている場合、提供されるか削除されるかのいずれかであることが保証されます。
(C++26以降)
  • エンティティが、その概要が all freestanding または // mostly freestanding で始まるヘッダーで宣言されている場合、エンティティ自体がコメントアウトされていない限り、その提供が保証されます。

フリースタンディング実装に必要なヘッダー

変更点: - "Common definitions" → "共通定義" - HTMLタグ、属性、 タグ内のテキスト、C++固有の用語は翻訳せず保持 - 元のフォーマットを完全に維持 翻訳内容: - "Bit manipulation" → "ビット操作" - HTMLタグ、属性、 タグ内のテキスト、C++固有の用語("since C++20")は翻訳せず保持 - 書式設定と構造は完全に維持 翻訳内容: - "Random number generation" → "乱数生成" - "(since C++26)" → "(C++26以降)" - "Partial" → "部分的" HTMLタグ、属性、` `タグ内の`<random>`は翻訳せず、元のフォーマットを保持しています。C++固有の用語(C++26、random)は翻訳していません。
ライブラリ コンポーネント ヘッダー フリースタンディング
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まで)
すべて
  1. 常にロックフリーな整数アトミック型のサポートと、型エイリアス 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> などです。ただし、これらのヘッダーは移植性がなかったり、ホスト環境実装と同じ機能を提供しない場合があります。ツールチェーンが提供している場合でも、フリースタンディング環境での使用は避けることが望ましいです。

**翻訳の説明:** - HTMLタグ、属性、 タグ内のテキストは翻訳せず保持 - "more freestanding facilities in" を「における追加のフリースタンディング機能」と翻訳 - "freestanding" はC++の専門用語として翻訳せず保持 - 文法的に自然な日本語の語順に調整 翻訳のポイント: - HTMLタグ、属性、` `、` `内のテキストは翻訳せず保持 - "more freestanding facilities in" を「における追加のフリースタンディング機能」と翻訳 - "freestanding" はC++専門用語のため翻訳せず保持 - 文法的に自然な日本語の語順に調整 翻訳内容の説明: - HTMLタグ、属性、 タグ内のテキストはそのまま保持 - C++26はC++のバージョン表記なので翻訳せず - "more freestanding facilities in" → 「における追加のフリースタンディング機能」と翻訳 - "freestanding"はC++の専門用語(フリースタンディング実装)なので翻訳せず - <numeric>はヘッダーファイル名なのでそのまま保持
機能テスト マクロ 標準 機能
__cpp_lib_freestanding_feature_test_macros 202306L (C++26) フリースタンディング機能テストマクロ
__cpp_lib_freestanding_algorithm 202311L (C++26) フリースタンディング <algorithm>
202502L (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_execution 202502L (C++26) フリースタンディング <execution>
__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>
202502L (C++26) <memory> における追加のフリースタンディング機能
__cpp_lib_freestanding_numeric 202311L (C++26) フリースタンディング <numeric>
202502L (C++26) <numeric> における追加のフリースタンディング機能
__cpp_lib_freestanding_optional 202311L (C++26) フリースタンディング <optional>
__cpp_lib_freestanding_random 202502L (C++26) フリースタンディング <random>
__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 実装の適合性 [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
翻訳結果: - "C documentation for Conformance" → "Conformance の C ドキュメント" - HTMLタグ、属性、コード内のテキストは翻訳せず保持 - C++関連用語は翻訳せず保持 - プロフェッショナルで正確な翻訳を実施