Freestanding- und gehostete Implementierungen
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)
Anforderungen an Multithread-Ausführungen und Datenrennen
|
(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.
|
(seit C++26) |
| 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 | |
- ↑ 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.
[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
|