Freestanding and hosted implementations
C++ 표준에 의해 정의된 구현에는 두 가지 종류가 있습니다: hosted 와 freestanding 구현입니다. hosted 구현의 경우, C++ 표준에서 요구하는 표준 라이브러리 헤더 집합이 freestanding 구현보다 훨씬 더 큽니다. freestanding 구현에서는 운영체제 없이도 실행이 가능할 수 있습니다.
구현의 종류는 구현에 따라 정의됩니다.
미리 정의된 매크로
__STDC_HOSTED__
는 호스티드 구현에서는
1
으로 확장되고, 프리스탠딩 구현에서는
0
으로 확장됩니다.
(C++11부터)
다중 스레드 실행 및 데이터 경쟁 에 대한 요구사항
|
(C++11 이후) |
main 함수에 대한 요구사항
| freestanding | hosted |
|---|---|
| freestanding 구현에서는 프로그램이 main 함수를 정의해야 하는지 여부는 구현에서 정의합니다. 시작과 종료는 구현에서 정의됩니다; 시작은 정적 저장 기간을 가진 네임스페이스 범위 객체들의 생성자 실행을 포함합니다; 종료는 정적 저장 기간 을 가진 객체들의 소멸자 실행을 포함합니다. |
hosted
구현에서는 프로그램이 전역 함수인
main
을 반드시 포함해야 합니다. 프로그램 실행은
main
함수가 호출되는 주요
실행 스레드
를 시작하며, 이 스레드에서 정적
저장 기간
을 가진 변수들이 초기화되고 소멸될 수 있습니다.
|
표준 라이브러리 헤더 에 대한 요구사항
독립형 구현체는 구현에서 정의된 헤더 집합을 갖습니다. 이 집합은 다음 표에 있는 헤더들을 최소한 포함합니다.
부분적으로 독립 실행형 헤더의 경우, 독립 실행형 구현은 해당 시놉시스에 있는 엔터티의 일부만 제공하면 됩니다:
- 엔티티가 주석 처리된 경우 // freestanding , 해당 엔티티가 제공됨이 보장됩니다.
|
(since C++26) |
- 엔티티가 시놉시스가 all freestanding 또는 // mostly freestanding 로 시작하는 헤더에서 선언된 경우, 해당 엔티티 자체가 주석 처리되지 않으면 제공이 보장됩니다.
독립형 구현에 필요한 헤더
| 라이브러리 | 구성 요소 | 헤더 | 독립 구현 |
|---|---|---|---|
| 언어 지원 | 공통 정의 | <cstddef> | All |
| C 표준 라이브러리 | <cstdlib> | 부분 지원 | |
| 구현 속성 |
<cfloat>
<climits> (since C++11) <limits> <version> (since C++20) |
All | |
| 정수 타입 | <cstdint> (C++11 이후) | 모두 | |
| 동적 메모리 관리 | <new> | 모두 | |
| 타입 식별 | <typeinfo> | 모두 | |
| 소스 위치 | <source_location> (C++20 이후) | 모두 | |
| 예외 처리 | <exception> | All | |
| 이니셜라이저 리스트 | <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> (since C++23) | All |
| 튜플 | <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 이후) | 부분적 | |
| Numerics |
부동 소수점 타입을 위한
수학 함수 |
<cmath> (since 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까지) |
모두 | |
- ↑ 항상 락-프리(lock-free)인 정수형 원자 타입에 대한 지원과 타입 별칭 std::atomic_signed_lock_free 및 std::atomic_unsigned_lock_free 의 존재는 독립형 구현(freestanding implementation)에서 구현에 따라 정의됩니다. (C++20부터)
참고 사항
일부 컴파일러 벤더는 독립형 구현을 완전히 지원하지 않을 수 있습니다. 예를 들어, GCC libstdc++는 버전 13 이전에 구현 및 빌드 문제가 있었던 반면, LLVM libcxx와 MSVC STL은 독립형을 지원하지 않습니다.
C++23에서는 많은 기능들이 부분 헤더와 함께 프리스탠딩으로 제공됩니다. 그러나 일부 헤더들이 향후 표준에서 프리스탠딩으로 전환될지 여부는 WG21에서 아직 논의 중입니다. 그럼에도 불구하고, vector , list , deque , 그리고 map 같은 컨테이너들은 예외와 힙에 대한 의존성으로 인해 절대 프리스탠딩이 되지 않을 것입니다.
GCC 13은 독립 실행 환경에서도 <optional> , <span> , <array> , 그리고 <bitset> 와 같은 더 많은 헤더를 제공하지만, 이러한 헤더들은 이식성이 떨어지거나 호스팅 구현과 동일한 기능을 제공하지 않을 수 있습니다. 툴체인이 이를 제공하더라도 독립 실행 환경에서 사용하는 것을 피하는 것이 좋습니다.
참고문헌
- C++23 표준 (ISO/IEC 14882:2024):
-
- 4.1 구현 준수 [intro.compliance] (p: 10)
-
- 6.9.2 다중 스레드 실행 및 데이터 경쟁 [intro.multithread] (p: 84)
-
- 6.9.3.1 main 함수 [basic.start.main] (p: 89)
-
- 16.4.2.5 독립형 구현 [compliance] (p: 483)
- 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++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| CWG 1938 | C++98 |
구현이 호스팅 구현인지 여부를
문서화할 필요가 없었음 |
구현 종류를 구현 정의 사항으로 지정
(따라서 문서화 필요) |
|
LWG 3653
( P1642R11 ) |
C++20 |
<coroutine>
는 독립 실행형이지만
독립 실행형이 아닌 std::hash 를 사용함 |
<functional>
를 부분적으로
독립 실행형으로 만듦 |
참고 항목
|
C 문서
for
Conformance
|