Namespaces
Variants

Freestanding and hosted implementations

From cppreference.net

El estándar de C++ define dos tipos de implementaciones: hosted y freestanding . Para las implementaciones hosted , el conjunto de headers de la librería estándar requeridos por el estándar de C++ es mucho mayor que para las implementaciones freestanding . En una implementación freestanding , la ejecución puede ocurrir sin un sistema operativo.

El tipo de implementación está definido por la implementación. La macro predefinida __STDC_HOSTED__ se expande a 1 para implementaciones hospedadas y 0 para implementaciones independientes. (desde C++11)

Contenidos

Requisitos sobre ejecuciones multi-hilo y carreras de datos

freestanding hosted
Bajo una implementación freestanding , está definido por la implementación si un programa puede tener más de un hilo de ejecución . Bajo una implementación hosted , un programa C++ puede tener más de un hilo ejecutándose concurrentemente.
(desde C++11)

Requisitos para la función main

freestanding hosted
En una implementación freestanding , está definido por la implementación si un programa debe definir una función main . La inicialización y finalización están definidas por la implementación; la inicialización contiene la ejecución de constructors para objetos de namespace scope con duración de almacenamiento estático; la finalización contiene la ejecución de destructors para objetos con storage duration estático. En una implementación hosted , un programa debe contener una función global llamada main . La ejecución de un programa inicia un thread of execution principal en el cual se invoca la función main , y en el cual las variables con storage duration estático pueden ser inicializadas y destruidas.

Requisitos para los encabezados de la biblioteca estándar

Una implementación independiente tiene un conjunto definido por la implementación de cabeceras. Este conjunto incluye al menos las cabeceras de la siguiente tabla.

Para encabezados parcialmente independientes, las implementaciones independientes solo necesitan proporcionar parte de las entidades en la sinopsis correspondiente:

  • Si una entidad está comentada como // freestanding , se garantiza que será proporcionada.
  • Si una entidad (función o plantilla de función) está comentada como // freestanding-deleted , se garantiza que estará proporcionada o eliminada.
(desde C++26)
  • Si una entidad se declara en un encabezado cuya sinopsis comienza con all freestanding o // mostly freestanding , se garantiza que será proporcionada si la entidad misma no está comentada.

Encabezados requeridos para una implementación independiente

Biblioteca Componente Cabeceras Independiente
Soporte del lenguaje Definiciones comunes <cstddef> Todos
Biblioteca estándar de C <cstdlib> Parcial
Propiedades de implementación <cfloat>
<climits> (since C++11)
<limits>
<version> (since C++20)
Todos
Tipos enteros <cstdint> (since C++11) Todos
Gestión de memoria dinámica <new> Todos
Identificación de tipos <typeinfo> Todos
Ubicación de origen <source_location> (desde C++20) Todos
Manejo de excepciones <exception> Todos
Listas de inicialización <initializer_list> (desde C++11) Todos
Comparaciones <compare> (desde C++20) Todos
Soporte para corrutinas <coroutine> (desde C++20) Todos
Soporte de tiempo de ejecución adicional <cstdarg> Todos
Soporte de depuración <debugging> (since C++26) Todos
Conceptos <concepts> (desde C++20) Todos
Diagnósticos Números de error <cerrno> (desde C++26) Parcial
Soporte para errores del sistema <system_error> (desde C++26) Parcial
Gestión de memoria Memoria <memory> (desde C++23) Parcial
Metaprogramación Rasgos de tipo <type_traits> (desde C++11) Todos
Aritmética racional en tiempo de compilación <ratio> (desde C++23) Todos
Utilidades generales Componentes de utilidad <utility> (since C++23) Todos
Tuplas <tuple> (desde C++23) Todos
Objetos función <functional> (desde C++20) Parcial
Conversiones numéricas primitivas <charconv> (desde C++26) Parcial
Manipulación de bits <bit> (desde C++20) Todos
Cadenas Clases de cadena <string> (desde C++26) Parcial
Utilidades de secuencia
terminada en nulo
<cstring> (desde C++26) Parcial
Procesamiento de texto Secuencia terminada en nulo
utilidades de secuencia
<cwchar> (desde C++26) Parcial
Iteradores <iterator> (desde C++23) Parcial
Rangos <ranges> (desde C++23) Parcial
Numerics Funciones matemáticas
para tipos de punto flotante
<cmath> (since C++26) Parcial
Generación de números aleatorios <random> (since C++26) Parcial
Soporte para concurrencia Atomics <atomic> (desde C++11) Todos [1]
Control de ejecución <execution> (desde C++26) Parcial
Encabezados obsoletos <ciso646> (hasta C++20)
<cstdalign> (desde C++11) (hasta C++20)
<cstdbool> (desde C++11) (hasta C++20)
Todos
  1. El soporte para tipos atómicos integrales siempre libres de bloqueo y la presencia de alias de tipo std::atomic_signed_lock_free y std::atomic_unsigned_lock_free están definidos por la implementación en una implementación independiente. (desde C++20)

Notas

Algunos proveedores de compiladores pueden no soportar completamente la implementación freestanding. Por ejemplo, GCC libstdc++ ha tenido problemas de implementación y compilación antes de la versión 13, mientras que LLVM libcxx y MSVC STL no soportan freestanding.

En C++23, muchas características se han hecho independientes con encabezados parciales. Sin embargo, aún está en discusión en WG21 si algunos encabezados se harán independientes en futuros estándares. Independientemente, contenedores como vector , list , deque , y map nunca serán independientes debido a sus dependencias en excepciones y heap.

GCC 13 proporciona más cabeceras, como <optional> , <span> , <array> , y <bitset> , para entornos independientes, aunque estas cabeceras pueden no ser portables o proporcionar las mismas capacidades que una implementación hospedada. Es mejor evitar usarlas en un entorno independiente, incluso si la cadena de herramientas las proporciona.

Macro de prueba de características Valor Estándar Característica
__cpp_lib_freestanding_feature_test_macros 202306L (C++26) macros de prueba de características para entornos independientes
__cpp_lib_freestanding_algorithm 202311L (C++26) freestanding <algorithm>
202502L (C++26) más facilidades independientes en <algorithm>
__cpp_lib_freestanding_array 202311L (C++26) independiente <array>
__cpp_lib_freestanding_char_traits 202306L (C++26) independiente std::char_traits
__cpp_lib_freestanding_charconv 202306L (C++26) entorno independiente <charconv>
__cpp_lib_freestanding_cstdlib 202306L (C++26) entorno independiente <cstdlib>
__cpp_lib_freestanding_cstring 202311L (C++26) entorno independiente <cstring>
__cpp_lib_freestanding_cwchar 202306L (C++26) entorno independiente <cwchar>
__cpp_lib_freestanding_errc 202306L (C++26) freestanding std::errc
__cpp_lib_freestanding_execution 202502L (C++26) ejecución independiente <execution>
__cpp_lib_freestanding_expected 202311L (C++26) entorno independiente <expected>
__cpp_lib_freestanding_functional 202306L (C++26) funcionalidad independiente <functional>
__cpp_lib_freestanding_iterator 202306L (C++26) independiente <iterator>
__cpp_lib_freestanding_mdspan 202311L (C++26) freestanding <mdspan>
__cpp_lib_freestanding_memory 202306L (C++26) freestanding <memory>
202502L (C++26) más facilidades de entorno independiente en <memory>
__cpp_lib_freestanding_numeric 202311L (C++26) independiente <numeric>
202502L (C++26) más facilidades independientes en <numeric>
__cpp_lib_freestanding_optional 202311L (C++26) entorno independiente <optional>
__cpp_lib_freestanding_random 202502L (C++26) freestanding <random>
__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) independiente <tuple>
__cpp_lib_freestanding_utility 202306L (C++26) independiente <utility>
__cpp_lib_freestanding_variant 202311L (C++26) freestanding <variant>

Referencias

  • Estándar C++23 (ISO/IEC 14882:2024):
  • 4.1 Cumplimiento de implementación [intro.compliance] (p: 10)
  • 6.9.2 Ejecuciones multi-hilo y carreras de datos [intro.multithread] (p: 84)
  • 6.9.3.1 Función main [basic.start.main] (p: 89)
  • 16.4.2.5 Implementaciones independientes [compliance] (p: 483)
  • Estándar C++20 (ISO/IEC 14882:2020):
  • 4.1 Cumplimiento de implementación [intro.compliance] (p: 7)
  • 6.9.2 Ejecuciones multi-hilo y carreras de datos [intro.multithread] (p: 77)
  • 6.9.3.1 Función main [basic.start.main] (p: 82)
  • 16.5.1.3 Implementaciones independientes [compliance] (p: 470)
  • Estándar C++17 (ISO/IEC 14882:2017):
  • 4.1 Cumplimiento de implementación [intro.compliance] (p: 5)
  • 4.7 Ejecuciones multi-hilo y carreras de datos [intro.multithread] (p: 15)
  • 6.6.1 Función main [basic.start.main] (p: 66)
  • 20.5.1.3 Implementaciones independientes [compliance] (p: 458)
  • Estándar C++14 (ISO/IEC 14882:2014):
  • 1.4 Cumplimiento de implementación [intro.compliance] (p: 5)
  • 1.10 Ejecuciones multi-hilo y carreras de datos [intro.multithread] (p: 11)
  • 3.6.1 Función principal [basic.start.main] (p: 62)
  • 17.6.1.3 Implementaciones independientes [compliance] (p: 441)
  • Estándar C++11 (ISO/IEC 14882:2011):
  • 1.4 Cumplimiento de implementación [intro.compliance] (p: 5)
  • 1.10 Ejecuciones multi-hilo y carreras de datos [intro.multithread] (p: 11)
  • 3.6.1 Función principal [basic.start.main] (p: 58)
  • 17.6.1.3 Implementaciones independientes [compliance] (p: 408)
  • Estándar C++03 (ISO/IEC 14882:2003):
  • 1.4 Cumplimiento de implementación [intro.compliance] (p: 3)
  • 3.6.1 Función principal [basic.start.main] (p: 43)
  • 17.4.1.3 Implementaciones independientes [lib.compliance] (p: 326)

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
CWG 1938 C++98 una implementación no necesitaba
documentar si era hospedada
se hizo el tipo de implementación definido por
la implementación (por lo tanto requiere documentación)
LWG 3653
( P1642R11 )
C++20 <coroutine> es independiente, pero
usa std::hash que no lo era
se hizo que <functional> sea
parcialmente independiente

Véase también

Documentación de C para Conformidad