2012-03-15 4 views
0

동적으로 할당 된 객체를 힙이 아닌 다른 위치에 배치 할 수 있습니까 ?? 어떻게 그것에 대해 과부하 된 new 연산자를 정의 할 것인가?힙이 아닌 다른 위치에 개체를 배치하는 방법은 무엇입니까?

나는 경우

class Arena{ 
     char area[2000]; 
public: 
     Arena(){} 
}; 

아레나 my_arena (1000) 같은 일부 클래스 아레나;을 등 성능에 힙에서 할당에 비해

내가 아레나 my_arena에서 오브젝트를 할당 할 .. 또한

, 메모리 할당에 가능한 단점은 무엇입니까?

+0

왜 그렇게하고 싶습니까? – Anycorn

+0

힙을 특정 크기로 만들고 싶습니다. – bhuwansahni

+3

[placement new()] (http://stackoverflow.com/questions/222557/cs-placement-new). – iammilind

답변

5

쉽게이 새로운 배치를 사용할 수 있습니다

MyClass* p = new (area) MyClass; 

이 두 가지 문제가 있습니다 당신이 알고 있어야하지만 :

  1. 는 보장이 없다 할 것이다 area``것을 정확하게 'MyClass`에 맞춰졌습니다. 나는 일반적으로 노동 조합을 통해 이것을 해결한다.
     
        union 
        { 
         double dummyForAlignment; 
         // Any other types which might be necessary... 
         unsigned char area[2000]; 
        }; 
    
    이것은 매우 특별하다; 유형을 확인하는 데 공식적인 보장은 없습니다. 실제로,`double` 대신에, 나는 기본형 대부분의 유니온을 사용합니다. 그리고 확실한 몇 가지 포인터가 있습니다.
  2. 정상적인 데이터 멤버와 마찬가지로 new을 사용했기 때문에 컴파일러에서 파괴를 처리하지 않습니다.
     
        p->~MyClass(); 
    
    즉, 의 개체 수와 할당 된 개체 수를 추적해야한다는 것을 의미합니다. 즉, 이 소멸자를 명시 적으로 호출합니다.

이 기술의 단점은 방금 언급 한 두 가지 점입니다. 또한 구성된 개체에 대한 형식화 된 포인터를 유지하지 않으면 에 디버거에서 문제를 볼 수 있습니다. 여전히 특정 용도로는 유용한 기술입니다. 기본 생성자가 필요 없도록하기 위해 Fallible 클래스에서 사용합니다. 표준 컨테이너가 필요하며 물론 사전 표준 벡터 또는 배열 클래스가 일반적으로 사용됩니다. 다양한 변형 클래스에도 유용합니다. 예를 들어, boost::variant에서 사용되는 것으로 가정합니다.

+0

내 게시물의 의미를 변경하는 편집 내용은 무엇입니까? 나는 철자법을 수정하는 사람들에게 문제가 없다. (나는 나쁜 철자이다.) 속하지 않은 단어를 추가 한 편집이 있었고 그 대답이 덜 정확했다. (나는 나의 자신의 편집으로 편집을 되 돌렸다.) –

0

간단히 오버로드 연산자 new &을 삭제하고 스택에 변수/클래스를 선언 할 수 있습니다.

또는 정적으로 관리 할 수 ​​있도록 일종의 정적 풀을 사용하고 싶을 수도 있습니다.

1

가능하지만 다소 낮은 수준입니다.

제임스가 C++ 03을 적절하게 다루었으므로 대안을 제시하겠습니다.

  • Boost.Optional : 당신이 부스트와 두 가지 대안이 C++ 03에

    첫째, 이름에서 알 수 있듯이 boost::optional<MyClass> 당신이 (또는하지 않음) 할 수있는 유형의 인스턴스.

  • Boost.Variant : boost::variant<SomeClass,OtherClass,YetAnotherClass>union이며 종류 안전성이 있고 보장 된 생성자/소멸자 호출이 있습니다. C++ 11

둘째는, 두 개의 매개 변수 std::aligned_storage<Len,Align> 도입 하였다

  • 정렬이 필요
  • 필요한 스토리지의 바이트 수

어두워 컴파일러를 사용 매직을 사용하여 정렬이 만족됨을 보장하므로 원시 메모리 조작 루틴을 빌드하기위한 좋은 기초가됩니다.

개인적으로 나는 귀하의 경우 boost::optional를 선택하는 것입니다 :

boost::optional<MyClass> Arena[256]; 

이 모델을 기본 boost::optional으로 를 인스턴스화하기 때문에 정확하게 당신이 원하는.

관련 문제