> 백엔드 개발 > C++ > C에서 배열 할당을 위해 Placement-New를 사용할 때 오버헤드를 어떻게 설명합니까?

C에서 배열 할당을 위해 Placement-New를 사용할 때 오버헤드를 어떻게 설명합니까?

Barbara Streisand
풀어 주다: 2024-12-12 14:12:10
원래의
848명이 탐색했습니다.

How to Account for Overhead When Using Placement-New for Array Allocation in C  ?

배열 배치-새: 버퍼에서 지정되지 않은 오버헤드 결정

C에서 배치-새 연산자를 사용하면 미리 할당된 메모리에 객체를 직접 생성할 수 있습니다. Placement-new를 사용하여 배열을 할당하는 경우 작업으로 인해 발생할 수 있는 지정되지 않은 오버헤드를 고려하는 것이 중요합니다.

C 11 표준에 따르면 Placement-new 표현식 new(buffer) T[5] 연산자 new[](sizeof(T)*5 y, 버퍼)를 호출합니다. 여기서 y는 호출마다 달라지는 음이 아닌 오버헤드 값을 나타냅니다. 이 오버헤드는 해당 값이 0보다 큰 경우 사전 할당된 버퍼의 크기에 영향을 미칠 수 있습니다.

다음 코드 조각을 고려하세요.

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

y에 대한 사전 지식이 없으면 결정하기 어렵습니다. 버퍼에 할당할 적절한 메모리 양. y가 0보다 큰 경우 할당된 버퍼가 부족할 수 있습니다.

이 문제를 해결하기 위해 표준에서는 처음에 오버헤드를 결정하는 책임을 구현 세부 사항에 맡겼습니다. 이러한 불확실성으로 인해 개발자는 new[](std::size_t, void* p) 연산자 사용을 피하거나 런타임 확인을 위해 배치 배열-new 연산자를 구현해야 했습니다.

업데이트

다행히 2019년 결함 보고서에서는 연산자에 대해 y가 항상 0이라고 지정하도록 표준을 수정하여 이 문제를 수정했습니다. new[](std::size_t, void* p). 이 조정은 C의 모든 버전에 소급 적용되어 일관되고 예측 가능한 할당 동작을 제공합니다.

따라서 Placement-new를 사용하여 사전 할당된 메모리에 직접 배열을 할당할 때 더 이상 지정되지 않은 오버헤드를 확인할 필요가 없습니다. 개발자는 버퍼 크기 초과에 대한 걱정 없이 연산자 new[](std::size_t, void* p)를 안전하게 활용할 수 있습니다.

위 내용은 C에서 배열 할당을 위해 Placement-New를 사용할 때 오버헤드를 어떻게 설명합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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