1

전역 클래스를 대체 할 수 없더라도 클래스 별 버전의 배치를 제공 할 수 있습니다. 클래스가 자체 배치 new 연산자를 제공해야하는 시나리오는 무엇입니까?클래스 별 버전의 새로운 게재 위치에서해야 할 일은 무엇입니까?

내 클래스가 placement new를 구현하지 않아도 다음 코드가 작동합니다. abc 연산자 new가 오버로드 된 경우를 가정합니다.

char arr[100]; 

abc *pt = new(&arr)abc; 

그래서 내가 몇 가지 기본 배치 새로운 존재, 해석하지만, 클래스에 대해 우리는 new 연산자의 우리의 자신의 버전을 제공 할 수 있습니다, 내 질문은에 대한 사용 사례는 무엇입니까? 다른 포인터가 무엇을하고 나서 전달 된 동일한 포인터를 반환해야합니까? 거기에 유용한 예제/시나리오가 있습니까?

답변

0

말의 입에서 곧게 wiki. '사용'이라는 제목의 섹션은 새로운 게재 위치의 필요성을 강조 표시합니다. 이 SO here도 도움이 될 스레드

UPDATE : 특별히 당신이 질문에 대답하기 위해; 클래스의 일부 객체를 구성하는 데 사용할 메모리 풀이 있지만 전체 클래스에 new 연산자를 오버로드하지 않으려는 경우 헤더 <new>이 제공하는 새로운 표준 배치를 사용할 수 있습니다.

+0

Abhay, 당신이 제공 한 스레드가 새로운 배치 필요성에 대해 토론합니다. 제 질문은 왜 기본 구현 대신 자신의 구현을 제공할까요? – Learner

+0

@learner : 기본 게재 위치 새로 만들기와 같은 것은 없습니다. 프로그래머는 하나를 제공해야하며 그 이유가 명시되어 있습니다. 일반적으로 클래스별로 이루어 지므로 복사 시멘틱 (C++ 코딩 표준 - Item 45, Sutter 및 Alexandrescu 참조)에주의해야 할 디자인 문제입니다. – Abhay

+0

@Abhay : 다음 코드는 클래스 클래스 donot이 배치를 새로 구현하더라도 작동합니다. char arr [100]; abc * pt = new (& arr) abc; 그래서 기본 배치가 새로 추가 되었습니까? 클래스에서 우리는 우리 자신의 버전을 제공 할 수 있습니다. 제 질문은 그것의 유스 케이스입니까? 그 중 하나가 다른 포인터로 전달 된 동일한 포인터를 반환해야합니다? 거기에 유용한 예제/시나리오가 있습니까? – Learner

1

퀴즈 질문처럼 들리는 클래스에 정의 된대로 후자의 경우 모든 클래스 객체는

빠르고 날씬 할당이
가장 일반적인 이유는 ... 새로운 오버로드 된 위치에 따라 배치됩니다 동적으로 할당해야하는 많은 작은 개체. 고정 크기 개체에 대한 사용자 지정 할당자는 일반 할당 자보다 할당 오버 헤드가 훨씬 적으며 조각화가 발생하지 않으며 일반적으로 더 빠릅니다. (또한 이러한 할당이 주 힙에서 제거되면 더 이상 주 힙 분할에 기여하지 않습니다.

마찬가지로 자유롭지 않은 할당 자 (여러 객체를 할당 할 수 있지만 함께 사용할 수는 없으며 동시에 만 사용할 수 있음)는 가능한 가장 빠른 할당 체계이며 오버 헤드가 없습니다 드문 경우). 수정하지 않는 데이터 구조를 작성하는 경우 전체적으로 삭제하는 것이 좋습니다.

다른 기지국 할당
다른 응용 프로그램 C++ 힙 상이한 힙으로부터 할당된다. 개체의 데이터가 다른 프로세스와 교환하기 위해 공유 메모리에 할당되어야하거나 소유권을 가져 와서 특정 할당 자의 사용을 요구하는 시스템 기능으로 전달되어야 할 수도 있습니다. (이 작업에는 모든 하위 객체에 대해 동일한 메커니즘을 구현해야하므로이를 구현하는 일반적인 방법은 없습니다).

비행 중 코드를 만들 때도 마찬가지입니다 (내가 사용하는 곳). 요즘에는이 메모리 페이지의 데이터를 실행할 수 있다고 OS에 알릴 필요가 있지만이 메모리는 다소 큰 덩어리로 표시됩니다 (예 : 4K). 다시 한번, 실행 권한이있는 운영체제에서 페이지 (4K)를 요청한 다음 새로운 위치 지정을 사용하여 그 위에 많은 작은 객체를 할당합니다.

+1

@peterchen : 이전에 나는 새로운 배치를 사용하는 것과 같다고 생각했습니다. :-) – Learner

0

게재 위치에 과부하가 걸릴지 모르겠다. 신품 만 일반 배송비입니다.유일하게 가능한 구현은 임시 객체를 생성하고 주어진 메모리 주소에 memcp'ing하는 것입니다. 다른 메모리를 할당하지 않아도되기 때문에 생각할 수 없습니다. 주어진 것을 사용하십시오.

1

불행히도 AFAIK에서는 표준 게재 위치 new 연산자의 클래스 별 오버로드를 수행 할 수 없으며 사용자 정의 게재 위치 새 연산자 만 사용할 수 있습니다. 그래서 유스 케이스는 다소 학문적이지만 C++ 11의 = delete을 사용하여 클래스에 새로운 배치를 금지하기 위해이 클래스를 사용하고 싶습니다. 이것은 표준 operator new으로 훌륭하게 작동하지만 새 배치에는 적합하지 않습니다.

관련 문제