Freestanding and hosted implementations
Der C++-Standard definiert zwei Arten von Implementierungen: hosted und freestanding Implementierungen. Bei hosted Implementierungen ist der Satz an Standardbibliothek-Headern, die der C++-Standard vorschreibt, deutlich größer als bei freestanding Implementierungen. In einer freestanding Implementierung kann die Ausführung ohne Betriebssystem erfolgen.
Die Art der Implementierung ist implementierungsdefiniert.
Das vordefinierte Makro
__STDC_HOSTED__
wird für Hosted-Implementierungen zu
1
expandiert und für Freestanding-Implementierungen zu
0
expandiert.
(seit C++11)
Anforderungen an Multithread-Ausführungen und Datenrennen
|
(seit C++11) |
Anforderungen an die main Funktion
| freestanding | hosted |
|---|---|
| In einer freestanding Implementierung ist implementierungsdefiniert, ob ein Programm eine main Funktion definieren muss. Start und Beendigung sind implementierungsdefiniert; der Start umfasst die Ausführung von Konstruktoren für Objekte im Namensbereich mit statischer Speicherdauer; die Beendigung umfasst die Ausführung von Destruktoren für Objekte mit statischer Speicherdauer . |
In einer
hosted
Implementierung muss ein Programm eine globale Funktion namens
main
enthalten. Die Ausführung eines Programms startet einen Haupt-
Ausführungsstrang
, in dem die
main
Funktion aufgerufen wird und in dem Variablen mit statischer
Speicherdauer
initialisiert und zerstört werden können.
|
Anforderungen an Standardbibliothek-Header
Eine freestanding Implementierung hat einen implementierungsdefinierten Satz von Headern. Dieser Satz enthält mindestens die Header in der folgenden Tabelle.
Für teilweise eigenständige Header müssen eigenständige Implementierungen nur einen Teil der Entitäten in der entsprechenden Synopsis bereitstellen:
- Wenn eine Entität als // freestanding kommentiert ist, wird garantiert, dass sie bereitgestellt wird.
|
(seit C++26) |
- Wenn eine Entität in einem Header deklariert wird, dessen Synopsis mit all freestanding oder // mostly freestanding beginnt, ist garantiert, dass sie bereitgestellt wird, falls die Entität selbst nicht kommentiert ist.
Für eine freistehende Implementierung erforderliche Header
| Bibliothek | Komponente | Header | Freistehend |
|---|---|---|---|
| Sprachunterstützung | Allgemeine Definitionen | <cstddef> | Alle |
| C-Standardbibliothek | <cstdlib> | Teilweise | |
| Implementierungseigenschaften |
<cfloat>
<climits> (since C++11) <limits> <version> (since C++20) |
Alle | |
| Integer-Typen | <cstdint> (since C++11) | Alle | |
| Dynamische Speicherverwaltung | <new> | Alle | |
| Typidentifikation | <typeinfo> | Alle | |
| Quellort | <source_location> (seit C++20) | Alle | |
| Exception-Handling | <exception> | Alle | |
| Initializer-Listen | <initializer_list> (seit C++11) | Alle | |
| Vergleiche | <compare> (since C++20) | Alle | |
| Coroutinen-Unterstützung | <coroutine> (seit C++20) | Alle | |
| Andere Laufzeitunterstützung | <cstdarg> | Alle | |
| Debugging-Unterstützung | <debugging> (since C++26) | Alle | |
| Konzepte | <concepts> (seit C++20) | Alle | |
| Diagnose | Fehlernummern | <cerrno> (since C++26) | Teilweise |
| Systemfehlerunterstützung | <system_error> (seit C++26) | Teilweise | |
| Speicherverwaltung | Speicher | <memory> (since C++23) | Teilweise |
| Metaprogrammierung | Typmerkmale | <type_traits> (since C++11) | Alle |
| Kompilierzeit-Rationalarithmetik | <ratio> (seit C++23) | Alle | |
| Allgemeine Hilfsmittel | Hilfskomponenten | <utility> (since C++23) | Alle |
| Tupel | <tuple> (seit C++23) | Alle | |
| Funktionsobjekte | <functional> (since C++20) | Teilweise | |
| Primitive numerische Konvertierungen | <charconv> (since C++26) | Teilweise | |
| Bitmanipulation | <bit> (seit C++20) | Alle | |
| Strings | String-Klassen | <string> (since C++26) | Teilweise |
|
Null-terminierte
Zeichenketten-Funktionen |
<cstring> (since C++26) | Teilweise | |
| Textverarbeitung |
Nullterminierte
Sequenz-Utilities |
<cwchar> (seit C++26) | Teilweise |
| Iteratoren | <iterator> (seit C++23) | Teilweise | |
| Ranges | <ranges> (seit C++23) | Teilweise | |
| Numerik |
Mathematische Funktionen
für Gleitkommatypen |
<cmath> (seit C++26) | Teilweise |
| Zufallszahlengenerierung | <random> (since C++26) | Teilweise | |
| Nebenläufigkeitsunterstützung | Atomics | <atomic> (since C++11) | Alle [1] |
| Ausführungssteuerung | <execution> (seit C++26) | Teilweise | |
| Veraltete Header |
<ciso646>
(bis C++20)
<cstdalign> (seit C++11) (bis C++20) <cstdbool> (seit C++11) (bis C++20) |
Alle | |
- ↑ Die Unterstützung für immer sperrfreie integrale atomare Typen und das Vorhandensein der Typaliase std::atomic_signed_lock_free und std::atomic_unsigned_lock_free sind in einer freistehenden Implementierung implementierungsdefiniert. (seit C++20)
Hinweise
Einige Compiler-Anbieter unterstützen möglicherweise freestanding Implementierungen nicht vollständig. Beispielsweise hatte GCC libstdc++ vor Version 13 Implementierungs- und Build-Probleme, während LLVM libcxx und MSVC STL freestanding nicht unterstützen.
In C++23 werden viele Funktionen mit partiellen Headern freistehend gemacht. Es wird jedoch in WG21 noch diskutiert, ob einige Header in zukünftigen Standards freistehend gemacht werden. Unabhängig davon werden Container wie vector , list , deque und map aufgrund ihrer Abhängigkeiten von Exceptions und Heap niemals freistehend sein.
GCC 13 stellt mehr Header bereit, wie zum Beispiel <optional> , <span> , <array> , und <bitset> , für freestanding, obwohl diese Header möglicherweise nicht portabel sind oder die gleichen Fähigkeiten wie eine gehostete Implementierung bieten. Es ist besser, sie in einer freestanding Umgebung nicht zu verwenden, selbst wenn die Toolchain sie bereitstellt.
Referenzen
- C++23-Standard (ISO/IEC 14882:2024):
-
- 4.1 Implementierungskonformität [intro.compliance] (S: 10)
-
- 6.9.2 Multithreaded-Ausführungen und Datenwettläufe [intro.multithread] (S: 84)
-
- 6.9.3.1 main-Funktion [basic.start.main] (S: 89)
-
- 16.4.2.5 Freistehende Implementierungen [compliance] (S: 483)
- C++20-Standard (ISO/IEC 14882:2020):
-
- 4.1 Implementierungskonformität [intro.compliance] (S: 7)
-
- 6.9.2 Multithreaded-Ausführungen und Datenwettläufe [intro.multithread] (S: 77)
-
- 6.9.3.1 main-Funktion [basic.start.main] (S: 82)
-
- 16.5.1.3 Freistehende Implementierungen [compliance] (S: 470)
- C++17-Standard (ISO/IEC 14882:2017):
-
- 4.1 Implementierungskonformität [intro.compliance] (S: 5)
-
- 4.7 Multithreaded-Ausführungen und Datenrennen [intro.multithread] (S: 15)
-
- 6.6.1 main-Funktion [basic.start.main] (S: 66)
-
- 20.5.1.3 Freistehende Implementierungen [compliance] (S: 458)
- C++14-Standard (ISO/IEC 14882:2014):
-
- 1.4 Implementierungskonformität [intro.compliance] (S: 5)
-
- 1.10 Multithreaded-Ausführungen und Datenrennen [intro.multithread] (S: 11)
-
- 3.6.1 Main-Funktion [basic.start.main] (S: 62)
-
- 17.6.1.3 Freistehende Implementierungen [compliance] (S: 441)
- C++11-Standard (ISO/IEC 14882:2011):
-
- 1.4 Implementierungskonformität [intro.compliance] (S: 5)
-
- 1.10 Multithreaded-Ausführungen und Datenrennen [intro.multithread] (S: 11)
-
- 3.6.1 Hauptfunktion [basic.start.main] (S: 58)
-
- 17.6.1.3 Freistehende Implementierungen [compliance] (S: 408)
- C++03-Standard (ISO/IEC 14882:2003):
-
- 1.4 Implementierungskonformität [intro.compliance] (S: 3)
-
- 3.6.1 Main-Funktion [basic.start.main] (S: 43)
-
- 17.4.1.3 Freistehende Implementierungen [lib.compliance] (S: 326)
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| CWG 1938 | C++98 |
Eine Implementierung musste nicht
dokumentieren, ob sie gehostet ist |
Machte die Implementierungsart implementierungs-
definiert (erfordert somit eine Dokumentation) |
|
LWG 3653
( P1642R11 ) |
C++20 |
<coroutine>
ist freistehend, aber
verwendet std::hash welches nicht freistehend war |
Machte
<functional>
teilweise
freistehend |
Siehe auch
|
C-Dokumentation
für
Konformität
|