> 백엔드 개발 > C++ > C 11 배열 배치-새 표현식으로 인해 지정되지 않은 오버헤드가 발생합니까?

C 11 배열 배치-새 표현식으로 인해 지정되지 않은 오버헤드가 발생합니까?

DDD
풀어 주다: 2024-12-13 19:07:14
원래의
425명이 탐색했습니다.

What Unspecified Overhead Do C  11 Array Placement-New Expressions Incur?

버퍼의 배열 배치-새 오버헤드

C 11 사양에서는 라이브러리 함수를 참조하는 식을 포함하여 모든 배열 새 식에서 지정되지 않은 오버헤드가 발생할 수 있다고 명시합니다. 연산자 new[](std::size_t, void*) 및 기타 배치 할당 함수. 이 오버헤드는 new를 호출할 때마다 달라질 수 있습니다.

예를 고려하세요.

void* buffer = malloc(sizeof(std::string) * 10);
std::string* p = ::new (buffer) std::string[10];
로그인 후 복사

사양에 따르면 new(버퍼) std::string[10]은 연산자 new[를 호출합니다. ](sizeof(std::string) * 10 y, buffer), 여기서 y는 음이 아닌 지정되지 않은 오버헤드 값입니다. y > 0이면 미리 할당된 버퍼가 부족합니다.

필요한 버퍼 크기 결정

표준에서 y 오버헤드 값을 정확하게 결정하는 것은 불가능합니다. 따라서 플랫폼 구현에 대한 구체적인 지식이 없으면 new[](std::size_t, void* p) 연산자를 사용하지 않는 것이 좋습니다.

pre와 함께 배열 배치-new를 사용해야 하는 경우 -할당된 버퍼를 사용하면 오버헤드를 동적으로 확인하는 새로운 배치 배열 새 함수를 만들 수 있습니다.

inline
void*
operator new[](std::size_t n, void* p, std::size_t limit)
{
    if (n <= limit)
        std::cout << "life is good\n";
    else
        throw std::bad_alloc();
    return p;
}

int main()
{
    alignas(std::string) char buffer[100];
    std::string* p = new(buffer, sizeof(buffer)) std::string[3];
}
로그인 후 복사

배열 크기를 변경하고 n 값을 검사하여 다음을 수행할 수 있습니다. 귀하의 플랫폼에 대한 y 오버헤드를 추론해 보세요.

위 내용은 C 11 배열 배치-새 표현식으로 인해 지정되지 않은 오버헤드가 발생합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿