Namensräume
Varianten
Aktionen

Freestanding- und gehostete Implementierungen

Von cppreference.com
< cpp

Es gibt zwei Arten von Implementierungen, die vom C++-Standard definiert werden: gehostete und freestanding Implementierungen. Für gehostete Implementierungen ist die Menge der vom C++-Standard geforderten Standardbibliotheks-Header deutlich größer als für freestanding Implementierungen. In einer freestanding Implementierung kann die Ausführung ohne Betriebssystem erfolgen.

Die Art der Implementierung ist implementierungsdefiniert. Das Makro __STDC_HOSTED__ ist vordefiniert mit 1 für gehostete Implementierungen und 0 für freestanding Implementierungen.(seit C++11)

Inhalt

Anforderungen an Multithread-Ausführungen und Datenrennen

freestanding gehostet
Unter einer freestanding Implementierung ist es implementierungsdefiniert, ob ein Programm mehr als einen Ausführungs-Thread haben kann. Unter einer gehosteten Implementierung kann ein C++-Programm mehr als einen Thread gleichzeitig ausführen.
(seit C++11)

[bearbeiten] Anforderungen an die main-Funktion

freestanding gehostet
In einer freestanding Implementierung ist es implementierungsdefiniert, ob ein Programm eine main-Funktion definieren muss. Start-up und Terminierung sind implementierungsdefiniert; Start-up beinhaltet die Ausführung von Konstruktoren für Objekte im Namensraum-Scope mit statischer Speicherdauer; Terminierung beinhaltet die Ausführung von Destruktoren für Objekte mit statischer Speicherdauer. In einer gehosteten Implementierung muss ein Programm eine globale Funktion namens main enthalten. Die Ausführung eines Programms startet einen Haupt-Ausführungs-Thread, in dem die main-Funktion aufgerufen wird, und in dem Variablen mit statischer Speicherdauer möglicherweise initialisiert und zerstört werden.

[bearbeiten] Anforderungen an Standardbibliotheks-Header

Eine freestanding Implementierung hat eine implementierungsdefinierte Menge von Headern. Diese Menge umfasst mindestens die Header in der folgenden Tabelle.

Für teilweise freestanding Header muss eine freestanding Implementierung nur einen Teil der Entitäten im entsprechenden Synopsis bereitstellen

  • Wenn eine Entität als // freestanding kommentiert ist, ist garantiert, dass sie bereitgestellt wird.
  • Wenn eine Entität (Funktion oder Funktionstemplate) als // freestanding-deleted kommentiert ist, ist garantiert, dass sie entweder bereitgestellt oder gelöscht wird.
(seit C++26)
Header, die für eine freestanding Implementierung erforderlich sind
Bibliothek Komponente Header  Freestanding 
Sprachunterstützung Allgemeine Definitionen <cstddef> Alle
C Standardbibliothek <cstdlib> Teilweise
Implementierungseigenschaften <cfloat>
<climits> (seit C++11)
<limits>
<version> (seit C++20)
Alle
Ganzzahltypen <cstdint> (seit C++11) Alle
Dynamische Speicherverwaltung <new> Alle
Typidentifizierung <typeinfo> Alle
Quellcode-Position <source_location> (seit C++20) Alle
Ausnahmebehandlung <exception> Alle
Initialisierungslisten <initializer_list> (seit C++11) Alle
Vergleiche <compare> (seit C++20) Alle
Coroutine-Unterstützung <coroutine> (seit C++20) Alle
Weitere Laufzeitunterstützung <cstdarg> Alle
Debugging-Unterstützung <debugging> (seit C++26) Alle
Konzepte <concepts> (seit C++20) Alle
Diagnose Fehlernummern <cerrno> (seit C++26) Teilweise
Systemfehlerunterstützung <system_error> (seit C++26) Teilweise
Speicherverwaltung  Speicher <memory> (seit C++23) Teilweise
Metaprogrammierung Typmerkmale <type_traits> (seit C++11) Alle
Rationelle Arithmetik zur Kompilierzeit  <ratio> (seit C++23) Alle
Allgemeine Hilfsmittel Hilfskomponenten <utility> (seit C++23) Alle
Tupel <tuple> (seit C++23) Alle
Funktionsobjekte <functional> (seit C++20) Teilweise
Primitive numerische Konvertierungen <charconv> (seit C++26) Teilweise
Bitmanipulation <bit> (seit C++20) Alle
Strings String-Klassen <string> (seit C++26) Teilweise
Nullterminierte
Sequenzhilfsmittel
<cstring> (seit C++26)
<cwchar> (seit C++26)
Teilweise
Iteratoren <iterator> (seit C++23) Teilweise
Bereiche (Ranges) <ranges> (seit C++23) Teilweise
Numerik Mathematische Funktionen
für Gleitkommatypen
<cmath> (seit C++26) Teilweise
Nebenläufigkeitsunterstützung Atomare Operationen <atomic> (seit C++11)     Alle[1]
Veraltete Header <ciso646> (bis C++20)
<cstdalign> (seit C++11)(bis C++20) 
<cstdbool> (seit C++11)(bis C++20)
Alle
  1. Die Unterstützung für immer lock-free ganzzahlige atomare Typen und die Anwesenheit von Typ-Aliassen std::atomic_signed_lock_free und std::atomic_unsigned_lock_free sind in einer freestanding Implementierung implementierungsdefiniert.(seit C++20)

[bearbeiten] Anmerkungen

Einige Compiler-Anbieter unterstützen möglicherweise keine vollständige Freestanding-Implementierung. Zum Beispiel hatte GCC libstdc++ vor Version 13 Implementierungs- und Build-Probleme, während LLVM libcxx und MSVC STL keine Freestanding-Unterstützung bieten.

In C++23 sind viele Funktionen mit teilweisen Headern als Freestanding verfügbar. Es wird jedoch noch in WG21 diskutiert, ob einige Header in zukünftigen Standards als Freestanding gemacht werden. Unabhängig davon werden Container wie vector, list, deque und map aufgrund ihrer Abhängigkeiten von Ausnahmen und dem Heap niemals Freestanding sein.

GCC 13 bietet weitere Header wie <optional>, <span>, <array> und <bitset> für Freestanding an, obwohl diese Header möglicherweise nicht portabel sind oder die gleichen Funktionen wie eine gehostete Implementierung bieten. Es ist besser, sie in einer Freestanding-Umgebung zu vermeiden, auch wenn die Toolchain sie bereitstellt.

Feature-Test-Makro Wert Std Feature
__cpp_lib_freestanding_feature_test_macros 202306L (C++26) freestanding Feature-Test-Makros
__cpp_lib_freestanding_algorithm 202311L (C++26) freestanding <algorithm>
__cpp_lib_freestanding_array 202311L (C++26) freestanding <array>
__cpp_lib_freestanding_char_traits 202306L (C++26) freestanding std::char_traits
__cpp_lib_freestanding_charconv 202306L (C++26) freestanding <charconv>
__cpp_lib_freestanding_cstdlib 202306L (C++26) freestanding <cstdlib>
__cpp_lib_freestanding_cstring 202311L (C++26) freestanding <cstring>
__cpp_lib_freestanding_cwchar 202306L (C++26) freestanding <cwchar>
__cpp_lib_freestanding_errc 202306L (C++26) freestanding std::errc
__cpp_lib_freestanding_expected 202311L (C++26) freestanding <expected>
__cpp_lib_freestanding_functional 202306L (C++26) freestanding <functional>
__cpp_lib_freestanding_iterator 202306L (C++26) freestanding <iterator>
__cpp_lib_freestanding_mdspan 202311L (C++26) freestanding <mdspan>
__cpp_lib_freestanding_memory 202306L (C++26) freestanding <memory>
__cpp_lib_freestanding_numeric 202311L (C++26) freestanding <numeric>
__cpp_lib_freestanding_optional 202311L (C++26) freestanding <optional>
__cpp_lib_freestanding_ranges 202306L (C++26) freestanding <ranges>
__cpp_lib_freestanding_ratio 202306L (C++26) freestanding <ratio>
__cpp_lib_freestanding_string_view 202311L (C++26) freestanding <string_view>
__cpp_lib_freestanding_tuple 202306L (C++26) freestanding <tuple>
__cpp_lib_freestanding_utility 202306L (C++26) freestanding <utility>
__cpp_lib_freestanding_variant 202311L (C++26) freestanding <variant>

[bearbeiten] Referenzen

  • C++23 Standard (ISO/IEC 14882:2024)
  • 4.1 Implementation compliance [intro.compliance] (S. 10)
  • 6.9.2 Multi-threaded executions and data races [intro.multithread] (S. 84)
  • 6.9.3.1 main function [basic.start.main] (S. 89)
  • 16.4.2.5 Freestanding implementations [compliance] (S. 483)
  • C++20 Standard (ISO/IEC 14882:2020)
  • 4.1 Implementation compliance [intro.compliance] (S. 7)
  • 6.9.2 Multi-threaded executions and data races [intro.multithread] (S. 77)
  • 6.9.3.1 main function [basic.start.main] (S. 82)
  • 16.5.1.3 Freestanding implementations [compliance] (S. 470)
  • C++17 Standard (ISO/IEC 14882:2017)
  • 4.1 Implementation compliance [intro.compliance] (S. 5)
  • 4.7 Multi-threaded executions and data races [intro.multithread] (S. 15)
  • 6.6.1 main function [basic.start.main] (S. 66)
  • 20.5.1.3 Freestanding implementations [compliance] (S. 458)
  • C++14 Standard (ISO/IEC 14882:2014)
  • 1.4 Implementation compliance [intro.compliance] (S. 5)
  • 1.10 Multi-threaded executions and data races [intro.multithread] (S. 11)
  • 3.6.1 Main function [basic.start.main] (S. 62)
  • 17.6.1.3 Freestanding implementations [compliance] (S. 441)
  • C++11 Standard (ISO/IEC 14882:2011)
  • 1.4 Implementation compliance [intro.compliance] (S. 5)
  • 1.10 Multi-threaded executions and data races [intro.multithread] (S. 11)
  • 3.6.1 Main function [basic.start.main] (S. 58)
  • 17.6.1.3 Freestanding implementations [compliance] (S. 408)
  • C++03-Standard (ISO/IEC 14882:2003)
  • 1.4 Implementation compliance [intro.compliance] (S. 3)
  • 3.6.1 Main function [basic.start.main] (S. 43)
  • 17.4.1.3 Freestanding implementations [lib.compliance] (S. 326)

[bearbeiten] Defect reports

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
CWG 1938 C++98 eine Implementierung musste nicht
dokumentieren, ob sie gehostet ist
machte die Art der Implementierung implementierungs-
definiert (erfordert somit eine Dokumentation)
LWG 3653
(P1642R11)
C++20 <coroutine> ist freestanding, aber
nutzt std::hash, was nicht
gemacht wurde. <functional> ist
teilweise freestanding

[bearbeiten] Siehe auch

C-Dokumentation für Konformität