Namespaces
Variants

std::allocator<T>:: allocate_at_least

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
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)
constexpr std:: allocation_result < T * , std:: size_t >
allocate_at_least ( std:: size_t n ) ;
(C++23부터)

초기화되지 않은 저장 공간을 count * sizeof ( T ) 바이트만큼 할당합니다. 여기서 count n 이상의 지정되지 않은 정수 값이며, :: operator new (추가적으로 std::align_val_t 인자가 있을 수 있음)를 호출하여 수행됩니다. 그러나 이 함수가 언제, 어떻게 호출되는지는 지정되지 않습니다.

그런 다음, 이 함수는 저장소에 T [ count ] 타입의 배열을 생성하고 해당 배열의 수명을 시작하지만, 그 요소들의 수명은 시작하지 않습니다.

이 함수를 상수 표현식에서 사용하려면, 할당된 저장 공간이 동일한 표현식의 평가 내에서 해제되어야 합니다.

이 함수의 사용은 T incomplete type 인 경우 잘못된 형식입니다.

목차

매개변수

n - 저장 공간을 할당할 객체 수의 하한

반환값

std:: allocation_result < T * > { p, count } , 여기서 p 는 아직 생성되지 않은 T 타입의 객체 count 개로 이루어진 배열의 첫 번째 요소를 가리킵니다.

예외

다음 경우에 std::bad_array_new_length 를 발생시킵니다: std:: numeric_limits < std:: size_t > :: max ( ) / sizeof ( T ) < n 이거나, 할당이 실패할 경우 std::bad_alloc 를 발생시킵니다.

참고 사항

allocate_at_least 는 주로 연속 컨테이너, 예를 들어 std::vector std::basic_string 에 제공되며, 가능한 경우 용량이 실제 할당된 크기와 일치하도록 하여 재할당을 줄이기 위한 목적을 가집니다.

"언제 그리고 어떻게 지정되지 않음"이라는 표현은 표준 라이브러리 컨테이너들이 수행하는 힙 할당을 결합하거나 최적화하여 제거할 수 있게 합니다. 비록 이러한 최적화들이 :: operator new 에 대한 직접 호출에서는 허용되지 않더라도 말입니다. 예를 들어, 이는 libc++에 의해 구현됩니다 ( [1] [2] ).

allocate_at_least 호출 후 요소 생성 전에, T * 의 포인터 연산은 할당된 배열 내에서 잘 정의되지만, 요소에 접근할 경우 동작은 정의되지 않습니다.

Feature-test 매크로 표준 기능
__cpp_lib_allocate_at_least 202302L (C++23) allocate_at_least

예제

#include <memory>
#include <print>
int main()
{
    const std::size_t count{69};
    std::allocator<int> alloc;
    std::allocation_result res{alloc.allocate_at_least(count)};
    std::print("count: {}\n"
               "res.ptr: {}\n"
               "res.count: {}\n", count, res.ptr, res.count);
    /* construct, use, then destroy elements */
    alloc.deallocate(res.ptr, res.count);
}

가능한 출력:

count: 69
res.ptr: 0x555a486a0960
res.count: 96

참고 항목

allocate_at_least 에 의해 할당된 저장 공간의 주소와 실제 크기를 기록합니다
(클래스 템플릿)
[static] (C++23)
할당자를 통해 요청된 크기 이상의 저장 공간을 할당합니다
( std::allocator_traits<Alloc> 의 public static 멤버 함수)