Freestanding and hosted implementations
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)
Requisitos sobre ejecuciones multi-hilo y carreras de datos
|
(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.
|
(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 | |
- ↑ 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.
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
|