Автономные и размещённые реализации
Стандарт C++ определяет два типа реализаций: размещённые и автономные реализации. Для размещённых реализаций набор заголовков стандартных библиотек, требуемых стандартом C++, намного больше, чем для автономных. В автономной реализации выполнение может происходить без операционной системы.
Тип реализации определяется реализацией. Макрос __STDC_HOSTED__ предопределён как 1 для размещённых реализаций и 0 для автономных реализаций.
(начиная с C++11)
Требования к многопоточному выполнению и гонке данных
|
(начиная с C++11) |
Требования к функции main
| автономная | размещённая |
|---|---|
| В автономной реализации это определяется реализацией, требуется ли в программе определять функцию main. Запуск и завершение определяется реализацией; запуск содержит выполнение конструкторов для объектов области видимости пространства имён со статической длительностью хранения; завершение содержит выполнение деструкторов для объектов со статической длительностью хранения. | В размещённой реализации программа должна содержать глобальную функцию с именем main. При выполнении программы запускается основной поток выполнения, в котором вызывается функция main и в котором переменные со статической длительностью хранения могут быть инициализированы и уничтожены.
|
Требования к заголовкам стандартной библиотеки
Автономная реализация имеет набор заголовков, определяемый реализацией. Этот набор включает в себя как минимум заголовки, указанные в следующей таблице.
Для частично автономных заголовков автономные реализации должны предоставлять только часть сущностей в соответствующем резюме:
- Если сущность прокомментирована
// автономная, она гарантированно будет предоставлена.
|
(начиная с C++26) |
| Библиотека | Компонент | Заголовки | Автономные |
|---|---|---|---|
| no section name | Общие определения | <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> | Все | |
| Концепты | <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) | Частично |
| Поддержка конкуренции | Атомарность | <atomic> (начиная с C++11) | Все[1] |
| Устаревшие заголовки | <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 всё ещё обсуждается, будут ли заголовки, такие как <array>, сделаны автономными в будущем стандарте (возможно, C++26). Несмотря на это, такие контейнеры, как vector, list, deque и map, никогда не будут автономными из-за их зависимости от исключений и кучи.
GCC 13 предоставляет больше заголовков, таких как optional, span, array и bitset, для автономных реализаций. Однако важно отметить, что эти заголовки могут не быть переносимыми или предоставлять те же возможности, что и размещённая реализация. Лучше избегать их использования в автономной среде, даже если они предоставляются набором инструментов.
Ссылки
- C++23 стандарт (ISO/IEC 14882:2023):
- 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++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| CWG 1938 | C++98 | реализация не должна документировать, размещена ли она | тип реализации определяется реализацией (таким образом, требуется документация) |
| LWG 3653 | C++20 | <coroutine> является автономной, но использует std::hash, чего не было |
делает <functional> частично автономным |
Смотрите также
Документация C по Соответствие
|