Автономные и размещённые реализации
Стандарт C++ определяет два типа реализаций: размещённые и автономные реализации. Для размещённых реализаций набор заголовков стандартных библиотек, требуемых стандартом C++, намного больше, чем для автономных. В автономной реализации выполнение может происходить без операционной системы.
Тип реализации определяется реализацией. Макрос __STDC_HOSTED__ предопределён как 1 для размещённых реализаций и 0 для автономных реализаций.
(начиная с C++11)
Требования к многопоточному выполнению и гонке данных
|
(начиная с C++11) |
[править] Требования к функции main
| автономная | размещённая |
|---|---|
| В автономной реализации это определяется реализацией, требуется ли в программе определять функцию main. Запуск и завершение определяется реализацией; запуск содержит выполнение конструкторов для объектов области видимости пространства имён со статической длительностью хранения; завершение содержит выполнение деструкторов для объектов со статической длительностью хранения. | В размещённой реализации программа должна содержать глобальную функцию с именем main. При выполнении программы запускается основной поток выполнения, в котором вызывается функция main и в котором переменные со статической длительностью хранения могут быть инициализированы и уничтожены.
|
[править] Требования к заголовкам стандартной библиотеки
Автономная реализация имеет набор заголовков, определяемый реализацией. Этот набор включает как минимум заголовки из следующей таблицы:
| Типы | <cstddef> |
| Свойства реализации | <limits> <cfloat> <climits> (начиная с C++11) <version> (начиная с C++20) |
| Целочисленные типы | <cstdint> (начиная с C++11) |
| Старт и останов | <cstdlib> (частично)[1] |
| Динамическое управление памятью | <new> |
| Идентификация типа | <typeinfo> |
| Местоположение источника | <source_location> (начиная с C++20) |
| Местоположение исходника | <source_location> (начиная с C++20) |
| Обработка исключений | <exception> |
| Списки инициализаторов | <initializer_list> (начиная с C++11) |
| Сравнения | <compare> (начиная с C++20) |
| Поддержка сопрограмм | <coroutine> (начиная с C++20) |
| Поддержка сопрограмм | <coroutine> (начиная с C++20) |
| Другая поддержка времени выполнения | <cstdarg> |
| Основные концепты библиотеки | <concepts> (начиная с C++20) |
| Свойства типов | <type_traits> (начиная с C++11) |
| Манипуляции битами | <bit> (начиная с C++20) |
| Атомарность | <atomic> (начиная с C++11)[2] |
| Устаревшие заголовки | <ciso646> <cstdalign> <cstdbool> (начиная с C++11)(до C++20) |
- ↑ Поставляемая версия заголовка
<cstdlib>должна декларировать как минимум функции std::abort, std::atexit, std::exit, std::at_quick_exit и std::quick_exit (начиная с C++11). - ↑ Поддержка целочисленных атомарных типов без блокировок и наличие псевдонимов типов std::atomic_signed_lock_free и std::atomic_unsigned_lock_free определяются реализацией автономной реализации. (начиная с C++20)
[править] Примечание
Поставщики компиляторов могут неправильно поддерживать автономную реализацию либо из-за проблем с реализацией (смотрите: GCC ошибка 100057), либо просто из-за игнорирования автономной реализации в целом (LLVM libcxx и msvc stl).
[править] Ссылки
- C++20 стандарт (ISO/IEC 14882:2020):
- 4.1 Соответствие реализации [intro.compliance](p: 7)
- 6.9.2 Многопоточные исполнения и гонки данных [intro.multithread](p: 77)
- 6.9.3.1 Функция main [basic.start.main](p: 82)
- 16.5.1.3 Отдельно стоящие реализации [compliance](p: 470)
- C++17 стандарт (ISO/IEC 14882:2017):
- 4.1 Соответствие реализации [intro.compliance](p: 5)
- 4.7 Многопоточные исполнения и гонки данных [intro.multithread](p: 15)
- 6.6.1 Функция main [basic.start.main](p: 66)
- 20.5.1.3 Отдельно стоящие реализации [compliance](p: 458)
- C++14 стандарт (ISO/IEC 14882:2014):
- 1.4 Соответствие реализации [intro.compliance](p: 5)
- 1.10 Многопоточные исполнения и гонки данных [intro.multithread](p: 11)
- 3.6.1 Функция main [basic.start.main](p: 62)
- 17.6.1.3 Отдельно стоящие реализации [compliance](p: 441)
- C++11 стандарт (ISO/IEC 14882:2011):
- 1.4 Соответствие реализации [intro.compliance](p: 5)
- 1.10 Многопоточные исполнения и гонки данных [intro.multithread](p: 11)
- 3.6.1 Функция main [basic.start.main](p: 58)
- 17.6.1.3 Отдельно стоящие реализации [compliance](p: 408)
- C++03 стандарт (ISO/IEC 14882:2003):
- 1.4 Соответствие реализации [intro.compliance](p: 3)
- 3.6.1 Функция main [basic.start.main](p: 43)
- 17.4.1.3 Отдельно стоящие реализации [lib.compliance](p: 326)
[править] Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| CWG 1938 | C++98 | реализация не должна документировать, размещена ли она | тип реализации определяется реализацией (таким образом, требуется документация) |
[править] Смотрите также
| Документация по C для Соответствие
|