Namespaces
Variants

Freestanding and hosted implementations

From cppreference.net

Стандарт C++ определяет два вида реализаций: hosted и freestanding реализации. Для hosted реализаций набор заголовков стандартной библиотеки, требуемых стандартом C++, значительно больше, чем для freestanding реализаций. В freestanding реализации выполнение может происходить без операционной системы.

Тип реализации определяется реализацией. Предопределённый макрос __STDC_HOSTED__ раскрывается в 1 для hosted-реализаций и в 0 для freestanding-реализаций. (начиная с C++11)

Содержание

Требования к многопоточным выполнениям и гонкам данных

freestanding hosted
В автономной реализации определяется реализацией, может ли программа иметь более одного потока выполнения . В hosted реализации программа на C++ может иметь более одного потока , выполняющихся параллельно.
(начиная с C++11)

Требования к функции main

freestanding hosted
В freestanding реализации определяется реализацией, требуется ли программе определять функцию main . Запуск и завершение определяются реализацией; запуск включает выполнение конструкторов для объектов пространства имен со статической продолжительностью хранения; завершение включает выполнение деструкторов для объектов со статической продолжительностью хранения . В hosted реализации программа должна содержать глобальную функцию с именем main . Выполнение программы запускает главный поток выполнения , в котором вызывается функция main , и в котором переменные со статической продолжительностью хранения могут быть инициализированы и уничтожены.

Требования к заголовкам стандартной библиотеки

Автономная реализация имеет определяемый реализацией набор заголовков. Этот набор включает как минимум заголовки из следующей таблицы.

Для частично самостоятельных заголовков, самостоятельным реализациям требуется предоставить только часть сущностей из соответствующей синопсиса:

  • Если сущность помечена комментарием // freestanding , гарантируется её предоставление.
  • Если сущность (функция или шаблон функции) помечена комментарием // freestanding-deleted , гарантируется, что она будет либо предоставлена, либо удалена.
(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)
Все
  1. Поддержка всегда свободных от блокировок целочисленных атомарных типов и наличие псевдонимов типов 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> , для автономной среды, хотя эти заголовки могут быть непереносимыми или предоставлять не те же возможности, что и в хост-реализации. Лучше избегать их использования в автономной среде, даже если инструментальная цепочка их предоставляет.

Макрос проверки возможностей Значение Стандарт Функция
__cpp_lib_freestanding_feature_test_macros 202306L (C++26) макросы тестирования возможностей для автономной среды
__cpp_lib_freestanding_algorithm 202311L (C++26) автономная версия <algorithm>
202502L (C++26) дополнительные возможности для автономной среды в <algorithm>
__cpp_lib_freestanding_array 202311L (C++26) автономная версия <array>
__cpp_lib_freestanding_char_traits 202306L (C++26) автономная реализация std::char_traits
__cpp_lib_freestanding_charconv 202306L (C++26) автономная реализация <charconv>
__cpp_lib_freestanding_cstdlib 202306L (C++26) автономная версия <cstdlib>
__cpp_lib_freestanding_cstring 202311L (C++26) автономная версия <cstring>
__cpp_lib_freestanding_cwchar 202306L (C++26) автономная реализация <cwchar>
__cpp_lib_freestanding_errc 202306L (C++26) автономная реализация std::errc
__cpp_lib_freestanding_execution 202502L (C++26) автономная версия <execution>
__cpp_lib_freestanding_expected 202311L (C++26) автономная версия <expected>
__cpp_lib_freestanding_functional 202306L (C++26) автономная версия <functional>
__cpp_lib_freestanding_iterator 202306L (C++26) автономная версия <iterator>
__cpp_lib_freestanding_mdspan 202311L (C++26) автономная версия <mdspan>
__cpp_lib_freestanding_memory 202306L (C++26) автономная версия <memory>
202502L (C++26) дополнительные возможности для автономной среды в <memory>
__cpp_lib_freestanding_numeric 202311L (C++26) автономная версия <numeric>
202502L (C++26) дополнительные возможности для автономной среды в <numeric>
__cpp_lib_freestanding_optional 202311L (C++26) автономная версия <optional>
__cpp_lib_freestanding_random 202502L (C++26) автономная версия <random>
__cpp_lib_freestanding_ranges 202306L (C++26) автономная реализация <ranges>
__cpp_lib_freestanding_ratio 202306L (C++26) автономная версия <ratio>
__cpp_lib_freestanding_string_view 202311L (C++26) автономная реализация <string_view>
__cpp_lib_freestanding_tuple 202306L (C++26) автономная версия <tuple>
__cpp_lib_freestanding_utility 202306L (C++26) автономная версия <utility>
__cpp_lib_freestanding_variant 202311L (C++26) автономная реализация <variant>

Ссылки

  • Стандарт 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