Namespaces
Variants

Freestanding and hosted implementations

From cppreference.net

La norme C++ définit deux types d'implémentations : hosted et freestanding . Pour les implémentations hosted , l'ensemble des en-têtes de bibliothèque standard requis par la norme C++ est beaucoup plus important que pour les implémentations freestanding . Dans une implémentation freestanding , l'exécution peut se produire sans système d'exploitation.

Le type de l'implémentation est défini par l'implémentation. La macro prédéfinie __STDC_HOSTED__ est développée en 1 pour les implémentations hébergées et en 0 pour les implémentations autonomes. (depuis C++11)

Table des matières

Exigences relatives aux exécutions multithread et aux courses de données

autonome hébergé
Dans une implémentation autonome , il est défini par l'implémentation si un programme peut avoir plus d'un thread d'exécution . Dans une implémentation hébergée , un programme C++ peut avoir plus d'un thread s'exécutant simultanément.
(depuis C++11)

Exigences relatives à la fonction main

freestanding hosted
Dans une implémentation freestanding , il est défini par l'implémentation si un programme doit définir une fonction main . Le démarrage et la terminaison sont définis par l'implémentation ; le démarrage contient l'exécution des constructors pour les objets de namespace scope avec une durée de stockage statique ; la terminaison contient l'exécution des destructors pour les objets avec une storage duration statique. Dans une implémentation hosted , un programme doit contenir une fonction globale appelée main . L'exécution d'un programme démarre un thread of execution principal dans lequel la fonction main est invoquée, et dans lequel les variables de storage duration statique peuvent être initialisées et détruites.

Exigences concernant les en-têtes de la bibliothèque standard

Une implémentation autonome possède un ensemble d'en-têtes défini par l'implémentation. Cet ensemble inclut au moins les en-têtes du tableau suivant.

Pour les en-têtes partiellement autonomes, les implémentations autonomes doivent uniquement fournir une partie des entités dans la synopsis correspondante :

  • Si une entité est commentée // freestanding , il est garanti qu'elle est fournie.
  • Si une entité (fonction ou modèle de fonction) est commentée // freestanding-deleted , il est garanti qu'elle soit soit fournie soit supprimée.
(depuis C++26)
  • Si une entité est déclarée dans un en-tête dont la synopsis commence par all freestanding ou // mostly freestanding , il est garanti qu'elle est fournie si l'entité elle-même n'est pas commentée.

En-têtes requis pour une implémentation autonome

Bibliothèque Composant En-têtes Autonome
Support du langage Définitions communes <cstddef> Tous
Bibliothèque standard C <cstdlib> Partiel
Propriétés d'implémentation <cfloat>
<climits> (depuis C++11)
<limits>
<version> (depuis C++20)
Tous
Types entiers <cstdint> (depuis C++11) Tous
Gestion dynamique de la mémoire <new> Tous
Identification de type <typeinfo> Tous
Emplacement source <source_location> (depuis C++20) Tous
Gestion des exceptions <exception> Tous
Listes d'initialisation <initializer_list> (depuis C++11) Tous
Comparaisons <compare> (depuis C++20) Tous
Prise en charge des coroutines <coroutine> (depuis C++20) Tous
Autres supports d'exécution <cstdarg> Tous
Support de débogage <debugging> (depuis C++26) Tous
Concepts <concepts> (depuis C++20) Tous
Diagnostics Numéros d'erreur <cerrno> (depuis C++26) Partiel
Prise en charge des erreurs système <system_error> (depuis C++26) Partielle
Gestion de la mémoire Mémoire <memory> (depuis C++23) Partiel
Métaprogrammation Traits de type <type_traits> (depuis C++11) Tous
Arithmétique rationnelle à la compilation <ratio> (depuis C++23) Tous
Utilitaires généraux Composants utilitaires <utility> (depuis C++23) Tous
Tuples <tuple> (depuis C++23) Tous
Objets fonction <functional> (depuis C++20) Partiel
Conversions numériques primitives <charconv> (depuis C++26) Partiel
Manipulation de bits <bit> (depuis C++20) Tous
Chaînes de caractères Classes de chaînes <string> (depuis C++26) Partiel
Utilités de séquences
terminées par un caractère nul
<cstring> (depuis C++26) Partiel
Traitement de texte Séquence terminée par un caractère nul
Utilitaires de séquence
<cwchar> (depuis C++26) Partiel
Itérateurs <iterator> (depuis C++23) Partiel
Plages <ranges> (depuis C++23) Partiel
Numérique Fonctions mathématiques
pour les types à virgule flottante
<cmath> (depuis C++26) Partiel
Génération de nombres aléatoires <random> (depuis C++26) Partiel
Support de la concurrence Atomics <atomic> (depuis C++11) Tous [1]
Contrôle d'exécution <execution> (depuis C++26) Partiel
En-têtes dépréciés <ciso646> (jusqu'à C++20)
<cstdalign> (depuis C++11) (jusqu'à C++20)
<cstdbool> (depuis C++11) (jusqu'à C++20)
Tous
  1. La prise en charge des types atomiques entiers toujours sans verrouillage et la présence des alias de type std::atomic_signed_lock_free et std::atomic_unsigned_lock_free sont définies par l'implémentation dans une implémentation autonome. (depuis C++20)

Notes

Certains fournisseurs de compilateurs peuvent ne pas prendre entièrement en charge l'implémentation autonome. Par exemple, GCC libstdc++ a connu des problèmes d'implémentation et de compilation avant la version 13, tandis que LLVM libcxx et MSVC STL ne prennent pas en charge le mode autonome.

En C++23, de nombreuses fonctionnalités sont rendues autonomes avec des en-têtes partiels. Cependant, il est encore en discussion au sein du WG21 si certains en-têtes seront rendus autonomes dans les futures normes. Quoi qu'il en soit, les conteneurs comme vector , list , deque , et map ne seront jamais autonomes en raison de leurs dépendances aux exceptions et au tas.

GCC 13 fournit davantage d'en-têtes, tels que <optional> , <span> , <array> , et <bitset> , pour l'environnement autonome, bien que ces en-têtes puissent ne pas être portables ou offrir les mêmes capacités qu'une implémentation hébergée. Il est préférable d'éviter de les utiliser dans un environnement autonome, même si la chaîne d'outils les fournit.

Macro de test de fonctionnalité Valeur Norme Fonctionnalité
__cpp_lib_freestanding_feature_test_macros 202306L (C++26) macros de test de fonctionnalités autonomes
__cpp_lib_freestanding_algorithm 202311L (C++26) algorithme autonome <algorithm>
202502L (C++26) davantage de fonctionnalités autonomes dans <algorithm>
__cpp_lib_freestanding_array 202311L (C++26) autonome <array>
__cpp_lib_freestanding_char_traits 202306L (C++26) autonome std::char_traits
__cpp_lib_freestanding_charconv 202306L (C++26) autonome <charconv>
__cpp_lib_freestanding_cstdlib 202306L (C++26) autonome <cstdlib>
__cpp_lib_freestanding_cstring 202311L (C++26) autonome <cstring>
__cpp_lib_freestanding_cwchar 202306L (C++26) autonome <cwchar>
__cpp_lib_freestanding_errc 202306L (C++26) environnement autonome std::errc
__cpp_lib_freestanding_execution 202502L (C++26) exécution autonome <execution>
__cpp_lib_freestanding_expected 202311L (C++26) autonome <expected>
__cpp_lib_freestanding_functional 202306L (C++26) autonome <functional>
__cpp_lib_freestanding_iterator 202306L (C++26) itérateur autonome <iterator>
__cpp_lib_freestanding_mdspan 202311L (C++26) autonome <mdspan>
__cpp_lib_freestanding_memory 202306L (C++26) autonome <memory>
202502L (C++26) davantage de fonctionnalités autonomes dans <memory>
__cpp_lib_freestanding_numeric 202311L (C++26) autonome <numeric>
202502L (C++26) davantage de fonctionnalités autonomes dans <numeric>
__cpp_lib_freestanding_optional 202311L (C++26) autonome <optional>
__cpp_lib_freestanding_random 202502L (C++26) autonome <random>
__cpp_lib_freestanding_ranges 202306L (C++26) autonome <ranges>
__cpp_lib_freestanding_ratio 202306L (C++26) autonome <ratio>
__cpp_lib_freestanding_string_view 202311L (C++26) autonome <string_view>
__cpp_lib_freestanding_tuple 202306L (C++26) autonome <tuple>
__cpp_lib_freestanding_utility 202306L (C++26) autonome <utility>
__cpp_lib_freestanding_variant 202311L (C++26) autonome <variant>

Références

  • Norme C++23 (ISO/CEI 14882:2024) :
  • 4.1 Conformité de l'implémentation [intro.compliance] (p: 10)
  • 6.9.2 Exécutions multi-thread et courses aux données [intro.multithread] (p: 84)
  • 6.9.3.1 Fonction main [basic.start.main] (p: 89)
  • 16.4.2.5 Implémentations autonomes [compliance] (p: 483)
  • Norme C++20 (ISO/CEI 14882:2020) :
  • 4.1 Conformité de l'implémentation [intro.compliance] (p: 7)
  • 6.9.2 Exécutions multi-thread et courses aux données [intro.multithread] (p: 77)
  • 6.9.3.1 Fonction main [basic.start.main] (p: 82)
  • 16.5.1.3 Implémentations autonomes [compliance] (p: 470)
  • Norme C++17 (ISO/CEI 14882:2017) :
  • 4.1 Conformité de l'implémentation [intro.compliance] (p: 5)
  • 4.7 Exécutions multi-thread et courses aux données [intro.multithread] (p: 15)
  • 6.6.1 Fonction main [basic.start.main] (p: 66)
  • 20.5.1.3 Implémentations autonomes [compliance] (p: 458)
  • Norme C++14 (ISO/CEI 14882:2014) :
  • 1.4 Conformité de l'implémentation [intro.compliance] (p. 5)
  • 1.10 Exécutions multithread et courses aux données [intro.multithread] (p. 11)
  • 3.6.1 Fonction main [basic.start.main] (p. 62)
  • 17.6.1.3 Implémentations autonomes [compliance] (p. 441)
  • Norme C++11 (ISO/CEI 14882:2011) :
  • 1.4 Conformité de l'implémentation [intro.compliance] (p: 5)
  • 1.10 Exécutions multithread et courses aux données [intro.multithread] (p: 11)
  • 3.6.1 Fonction main [basic.start.main] (p: 58)
  • 17.6.1.3 Implémentations autonomes [compliance] (p: 408)
  • Norme C++03 (ISO/CEI 14882:2003) :
  • 1.4 Conformité de l'implémentation [intro.compliance] (p. 3)
  • 3.6.1 Fonction main [basic.start.main] (p. 43)
  • 17.4.1.3 Implémentations autonomes [lib.compliance] (p. 326)

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement tel que publié Comportement correct
CWG 1938 C++98 une implémentation n'avait pas besoin
de documenter si elle est hébergée
a rendu le type d'implémentation défini
par l'implémentation (nécessite donc une documentation)
LWG 3653
( P1642R11 )
C++20 <coroutine> est autonome, mais
utilise std::hash qui ne l'était pas
a rendu <functional> partiellement
autonome

Voir aussi

Documentation C pour Conformité