Пространства имён
Варианты
Действия

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

Материал из cppreference.com
< cpp

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

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

Содержание

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

автономная размещённая
При Автономной реализации, может ли программа иметь более одного потока выполнения определяется конкретной реализацией. В размещённой реализации программа на C++ может иметь более одного потока, выполняемых одновременно.
(начиная с 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)
  1. Поставляемая версия заголовка <cstdlib> должна декларировать как минимум функции std::abort, std::atexit, std::exit, std::at_quick_exit и std::quick_exit (начиная с C++11).
  2. Поддержка целочисленных атомарных типов без блокировок и наличие псевдонимов типов 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 для Соответствие