Namespaces
Variants

std:: start_lifetime_as, std:: start_lifetime_as_array

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Explicit lifetime management
start_lifetime_as
(C++23)
start_lifetime_as_array
(C++23)
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
헤더에 정의됨 <memory>
std::start_lifetime_as
template < class T >
T * start_lifetime_as ( void * p ) noexcept ;
(1) (C++23부터)
template < class T >
const T * start_lifetime_as ( const void * p ) noexcept ;
(2) (C++23부터)
template < class T >
volatile T * start_lifetime_as ( volatile void * p ) noexcept ;
(3) (C++23부터)
template < class T >
const volatile T * start_lifetime_as ( const volatile void * p ) noexcept ;
(4) (C++23부터)
std::start_lifetime_as_array
template < class T >
T * start_lifetime_as_array ( void * p, std:: size_t n ) noexcept ;
(5) (C++23부터)
template < class T >

const T * start_lifetime_as_array ( const void * p,

std:: size_t n ) noexcept ;
(6) (C++23부터)
template < class T >

volatile T * start_lifetime_as_array ( volatile void * p,

std:: size_t n ) noexcept ;
(7) (C++23부터)
template < class T >

const volatile T * start_lifetime_as_array ( const volatile void * p,

std:: size_t n ) noexcept ;
(8) (C++23부터)
1-4) 암묵적으로 생성 T 타입의 완전한 객체(주소가 p 인)와 그 내부에 중첩된 객체들을 생성합니다. 생성된 각 객체 obj 의 값은 TriviallyCopyable 타입 U 에 대해 std:: bit_cast < U > ( E ) 호출과 동일한 방식으로 결정되지만, 저장소가 실제로 접근되지는 않습니다. 여기서 E obj 를 나타내는 타입 U 의 lvalue입니다. 그렇지 않은 경우, 생성된 객체들의 값은 지정되지 않습니다.
  • T ImplicitLifetimeType 이어야 하며 완전한 타입 이어야 합니다. 그렇지 않으면 프로그램은 형식에 맞지 않습니다.
  • 다음의 경우 동작은 정의되지 않습니다:
  • [ p , ( char * ) p + sizeof ( T ) ) p 를 통해 접근 가능한 저장소 영역의 부분집합이 아닌 할당된 저장소 영역을 나타내지 않는 경우, 또는
  • 해당 영역이 T 에 대해 적절하게 정렬되지 않은 경우.
  • 지정되지 않은 값은 불확정적일 수 있습니다.
5-8) 암시적으로 생성 합니다. 요소 타입이 T 이고 길이가 n 인 배열을. 정확히 말하면, n > 0 true 인 경우, 이는 std :: start_lifetime_as < U > ( p ) 와 동등합니다. 여기서 U 는 " n T 개의 배열" 타입입니다. 그렇지 않으면, 이 함수는 아무 효과도 가지지 않습니다.
  • T 완전한 타입 이어야 합니다. 그렇지 않으면, 프로그램은 ill-formed입니다.
  • 다음의 경우 동작은 정의되지 않습니다:
  • 널이 아닌 p T 배열에 적절히 정렬되지 않은 경우, 또는
  • n <= std:: size_t ( - 1 ) / sizeof ( T ) false 인 경우, 또는
  • n > 0 이고 [ ( char * ) p , ( char * ) p + ( n * sizeof ( T ) ) ) p 를 통해 접근 가능한 저장 영역의 부분집합인 할당된 저장 영역을 나타내지 않는 경우.

목차

매개변수

p - 객체로 구성된 영역의 주소
n - 생성될 배열 요소의 개수

반환값

1-4) 위에서 설명한 완전한 객체에 대한 포인터입니다.
5-8) 생성된 배열의 첫 번째 요소에 대한 포인터(존재하는 경우); 그렇지 않으면 p 와 비교 시 동일한 포인터.

참고 사항

new ( void_ptr ) unsigned char [ size ] 또는 new ( void_ptr ) std:: byte [ size ] std::start_lifetime_as 의 비타입 버전으로 동작하지만, 객체 표현을 유지하지는 않습니다.

std :: start_lifetime_as 는 배열이 아닌 타입과 경계가 알려진 배열을 처리하는 반면, std :: start_lifetime_as_array 는 경계가 알려지지 않은 배열을 처리합니다.

기능 테스트 매크로 표준 기능
__cpp_lib_start_lifetime_as 202207L (C++23) 명시적 수명 관리

예제

#include <complex>
#include <iostream>
#include <memory>
int main()
{
    alignas(std::complex<float>) unsigned char network_data[sizeof(std::complex<float>)]
    {
        0xcd, 0xcc, 0xcc, 0x3d, 0xcd, 0xcc, 0x4c, 0x3e
    };
//  auto d = *reinterpret_cast<std::complex<float>*>(network_data);
//  std::cout << d << '\n'; // UB: network_data does not point to a complex<float>
//  auto d1 = *std::launder(reinterpret_cast<std::complex<float>*>(network_data));
//  std::cout << d1 << '\n'; // UB: implicitly created objects have dynamic storage
//                                  duration and have indeterminate value initially,
//                                  even when an array which provides storage for
//                                  them has determinate bytes.
//                                  See also CWG2721.
    auto d2 = *std::start_lifetime_as<std::complex<float>>(network_data);
    std::cout << d2 << '\n'; // OK
}

가능한 출력:

(0.1,0.2)

참고문헌

  • C++23 표준 (ISO/IEC 14882:2024):
  • 20.2.6 명시적 수명 관리 [obj.lifetime]

참고 항목

(C++20)
한 타입의 객체 표현을 다른 타입의 객체 표현으로 재해석함
(함수 템플릿)
span 을 해당 객체의 기본 바이트 뷰로 변환함
(함수 템플릿)