Freestanding and hosted implementations
Стандарт C++ определяет два вида реализаций: hosted и freestanding реализации. Для hosted реализаций набор заголовков стандартной библиотеки, требуемых стандартом C++, значительно больше, чем для freestanding реализаций. В freestanding реализации выполнение может происходить без операционной системы.
Тип реализации определяется реализацией.
Предопределённый макрос
__STDC_HOSTED__
раскрывается в
1
для hosted-реализаций и в
0
для freestanding-реализаций.
(начиная с C++11)
Требования к многопоточным выполнениям и гонкам данных
|
(начиная с C++11) |
Требования к функции main
| freestanding | hosted |
|---|---|
| В freestanding реализации определяется реализацией, требуется ли программе определять функцию main . Запуск и завершение определяются реализацией; запуск включает выполнение конструкторов для объектов пространства имен со статической продолжительностью хранения; завершение включает выполнение деструкторов для объектов со статической продолжительностью хранения . |
В
hosted
реализации программа должна содержать глобальную функцию с именем
main
. Выполнение программы запускает главный
поток выполнения
, в котором вызывается функция
main
, и в котором переменные со статической
продолжительностью хранения
могут быть инициализированы и уничтожены.
|
Требования к заголовкам стандартной библиотеки
Автономная реализация имеет определяемый реализацией набор заголовков. Этот набор включает как минимум заголовки из следующей таблицы.
Для частично самостоятельных заголовков, самостоятельным реализациям требуется предоставить только часть сущностей из соответствующей синопсиса:
- Если сущность помечена комментарием // freestanding , гарантируется её предоставление.
|
(since C++26) |
- Если сущность объявлена в заголовке, синопсис которого начинается с all freestanding или // mostly freestanding , гарантируется, что она будет предоставлена, если сама сущность не закомментирована.
Заголовки, необходимые для автономной реализации
| Библиотека | Компонент | Заголовочные файлы | Автономная реализация |
|---|---|---|---|
| Поддержка языка | Общие определения | <cstddef> | Все |
| Стандартная библиотека C | <cstdlib> | Частично | |
| Свойства реализации |
<cfloat>
<climits> (since C++11) <limits> <version> (since C++20) |
Все | |
| Целочисленные типы | <cstdint> (since C++11) | Все | |
| Управление динамической памятью | <new> | Все | |
| Идентификация типов | <typeinfo> | Все | |
| Местоположение исходного кода | <source_location> (since C++20) | Все | |
| Обработка исключений | <exception> | Все | |
| Списки инициализации | <initializer_list> (начиная с C++11) | Все | |
| Сравнения | <compare> (since C++20) | Все | |
| Поддержка корутин | <coroutine> (since C++20) | Все | |
| Другая поддержка времени выполнения | <cstdarg> | Все | |
| Поддержка отладки | <debugging> (since C++26) | Все | |
| Концепты | <concepts> (начиная с C++20) | Все | |
| Диагностика | Номера ошибок | <cerrno> (начиная с C++26) | Частично |
| Поддержка системных ошибок | <system_error> (since C++26) | Частичная | |
| Управление памятью | Память | <memory> (since C++23) | Частично |
| Метапрограммирование | Признаки типов | <type_traits> (since C++11) | Все |
| Арифметика рациональных чисел на этапе компиляции | <ratio> (начиная с C++23) | Все | |
| Общие утилиты | Компоненты утилит | <utility> (since C++23) | Все |
| Кортежи | <tuple> (since C++23) | Все | |
| Объекты функций | <functional> (начиная с C++20) | Частично | |
| Примитивные числовые преобразования | <charconv> (since C++26) | Частично | |
| Манипуляция битами | <bit> (since C++20) | Все | |
| Строки | Классы строк | <string> (начиная с C++26) | Частично |
|
Утилиты для нуль-терминированных
последовательностей |
<cstring> (since C++26) | Частично | |
| Обработка текста |
Утилиты для нуль-терминированных
последовательностей |
<cwchar> (начиная с C++26) | Частично |
| Итераторы | <iterator> (начиная с C++23) | Частично | |
| Диапазоны | <ranges> (начиная с C++23) | Частично | |
| Численные методы |
Математические функции
для типов с плавающей точкой |
<cmath> (начиная с C++26) | Частично |
| Генерация случайных чисел | <random> (начиная с C++26) | Частично | |
| Поддержка многопоточности | Атомарные операции | <atomic> (since C++11) | Все [1] |
| Управление выполнением | <execution> (since C++26) | Частично | |
| Устаревшие заголовки |
<ciso646>
(до C++20)
<cstdalign> (с C++11) (до C++20) <cstdbool> (с C++11) (до C++20) |
Все | |
- ↑ Поддержка всегда свободных от блокировок целочисленных атомарных типов и наличие псевдонимов типов std::atomic_signed_lock_free и std::atomic_unsigned_lock_free определяются реализацией в независимой реализации. (начиная с C++20)
Примечания
Некоторые производители компиляторов могут не полностью поддерживать автономную реализацию. Например, GCC libstdc++ имел проблемы с реализацией и сборкой до версии 13, в то время как LLVM libcxx и MSVC STL не поддерживают автономный режим.
В C++23 многие функции стали автономными с частичными заголовками. Однако в WG21 всё ещё обсуждается, будут ли некоторые заголовки сделаны автономными в будущих стандартах. Тем не менее, контейнеры, такие как vector , list , deque и map никогда не станут автономными из-за их зависимости от исключений и кучи.
GCC 13 предоставляет больше заголовков, таких как <optional> , <span> , <array> , и <bitset> , для автономной среды, хотя эти заголовки могут быть непереносимыми или предоставлять не те же возможности, что и в хост-реализации. Лучше избегать их использования в автономной среде, даже если инструментальная цепочка их предоставляет.
Ссылки
- Стандарт C++23 (ISO/IEC 14882:2024):
-
- 4.1 Соответствие реализации [intro.compliance] (стр: 10)
-
- 6.9.2 Многопоточные выполнения и гонки данных [intro.multithread] (стр: 84)
-
- 6.9.3.1 Функция main [basic.start.main] (стр: 89)
-
- 16.4.2.5 Автономные реализации [compliance] (стр: 483)
- Стандарт C++20 (ISO/IEC 14882:2020):
-
- 4.1 Соответствие реализации [intro.compliance] (стр: 7)
-
- 6.9.2 Многопоточные выполнения и гонки данных [intro.multithread] (стр: 77)
-
- 6.9.3.1 Функция main [basic.start.main] (стр: 82)
-
- 16.5.1.3 Автономные реализации [compliance] (стр: 470)
- Стандарт C++17 (ISO/IEC 14882:2017):
-
- 4.1 Соответствие реализации [intro.compliance] (стр: 5)
-
- 4.7 Многопоточные выполнения и гонки данных [intro.multithread] (стр: 15)
-
- 6.6.1 Функция main [basic.start.main] (стр: 66)
-
- 20.5.1.3 Автономные реализации [compliance] (стр: 458)
- Стандарт C++14 (ISO/IEC 14882:2014):
-
- 1.4 Соответствие реализации [intro.compliance] (стр: 5)
-
- 1.10 Многопоточные выполнения и гонки данных [intro.multithread] (стр: 11)
-
- 3.6.1 Функция main [basic.start.main] (стр: 62)
-
- 17.6.1.3 Автономные реализации [compliance] (стр: 441)
- Стандарт C++11 (ISO/IEC 14882:2011):
-
- 1.4 Соответствие реализации [intro.compliance] (стр: 5)
-
- 1.10 Многопоточные выполнения и гонки данных [intro.multithread] (стр: 11)
-
- 3.6.1 Функция main [basic.start.main] (стр: 58)
-
- 17.6.1.3 Автономные реализации [compliance] (стр: 408)
- Стандарт C++03 (ISO/IEC 14882:2003):
-
- 1.4 Соответствие реализации [intro.compliance] (стр: 3)
-
- 3.6.1 Функция main [basic.start.main] (стр: 43)
-
- 17.4.1.3 Автономные реализации [lib.compliance] (стр: 326)
Отчёты о дефектах
Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| CWG 1938 | C++98 |
реализация не требовала
документирования, является ли она hosted |
сделано, что тип реализации является implementation-
defined (следовательно, требует документации) |
|
LWG 3653
( P1642R11 ) |
C++20 |
<coroutine>
является freestanding, но
использует std::hash который не был |
сделано, что
<functional>
является
частично freestanding |
Смотрите также
|
C documentation
для
Conformance
|