Spec-Zone.ru › C++

Автономные реализации и реализации с размещением

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

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

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

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

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

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

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

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

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

  • Если сущность помечена комментарием // freestanding, гарантируется, что она будет предоставлена.
  • Если сущность (функция или шаблон функции) помечена комментарием // freestanding-deleted, гарантируется, что она будет либо предоставлена, либо удалена.
(начиная с C++26)
  • Если сущность объявлена в заголовке, сводка которого начинается с allfreestanding или // mostly freestanding, гарантируется, что она будет предоставлена, если сама сущность не помечена комментарием.

Заголовки, необходимые для автономной реализации

Библиотека Компонент Заголовки Автономная реализация
Поддержка языка Общие определения <cstddef> Все
Стандартная библиотека C <cstdlib> Частично
Свойства реализации <cfloat>
<climits> (начиная с C++11)
<limits>
<version> (начиная с C++20)
Все
Целочисленные типы <cstdint> (начиная с C++11) Все
Управление динамической памятью <new> Все
Идентификация типов <typeinfo> Все
Местоположение в исходном коде <source_location> (начиная с C++20) Все
Обработка исключений <exception> Все
Списки инициализаторов <initializer_list> (начиная с C++11) Все
Сравнения <compare> (начиная с C++20) Все
Поддержка сопрограмм <coroutine> (начиная с C++20) Все
Прочая поддержка времени выполнения <cstdarg> Все
Поддержка отладки <debugging> (начиная с C++26) Все
Концепты <concepts> (начиная с C++20) Все
Диагностика Коды ошибок <cerrno> (начиная с C++26) Частично
Поддержка системных ошибок <system_error> (начиная с C++26) Частично
Управление памятью Память <memory> (начиная с C++23) Частично
Метапрограммирование Свойства типов <type_traits> (начиная с C++11) Все
Рациональная арифметика во время компиляции <ratio> (начиная с C++23) Все
Утилиты общего назначения Компоненты-утилиты <utility> (начиная с C++23) Все
Кортежи <tuple> (начиная с C++23) Все
Функциональные объекты <functional> (начиная с C++20) Частично
Преобразования примитивных числовых типов <charconv> (начиная с C++26) Частично
Манипуляции битами <bit> (начиная с C++20) Все
Строки Строковые классы <string> (начиная с C++26) Частично
Утилиты для последовательностей
с нулевым завершающим символом
<cstring> (начиная с C++26) Частично
Обработка текста Утилиты для последовательностей
с нулевым завершающим символом
<cwchar> (начиная с C++26) Частично
Итераторы <iterator> (начиная с C++23) Частично
Диапазоны <ranges> (начиная с C++23) Частично
Числовые средства Математические функции
для типов с плавающей точкой
<cmath> (начиная с C++26) Частично
Генерация случайных чисел <random> (начиная с C++26) Частично
Поддержка параллелизма Атомарные операции <atomic> (начиная с C++11) Все[1]
Управление выполнением <execution> (начиная с 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 Главная функция [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 Главная функция [basic.start.main] (с. 58)
    • 17.6.1.3 Автономные реализации [compliance] (с. 408)
  • Стандарт C++03 (ISO/IEC 14882:2003):
    • 1.4 Соответствие реализации [intro.compliance] (с. 3)
    • 3.6.1 Главная функция [basic.start.main] (с. 43)
    • 17.4.1.3 Автономные реализации [lib.compliance] (с. 326)

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.

DR Применено к Поведение в опубликованной версии Правильное поведение
CWG 1938 C++98 реализация не должна была
документировать, является ли она реализацией с размещением
вид реализации был определён как определяемый реализацией
(и, следовательно, требующий документирования)
LWG 3653
(P1642R11)
C++20 <coroutine> является автономным, но
использует std::hash, который таковым не являлся
заголовок <functional> был сделан
частично автономным

См. также

Документация по C о соответствии стандарту

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/freestanding

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API