2014-01-15 3 views
0

매크로를 추가하여 라이브러리를 단순화하려고합니다. 나는 매크로가 달성 할 수있는 모든 다른 것들에 대해 읽었지만, 내가 의도 한대로 작동하는 무언가를 구현하는 행운이 없었다.변수 및 유형이있는 C++ 03 매크로 정의?

게재 위치 새 기능과 함께 사용할 메모리 관리자를 작성했습니다. 할당 된 내용과 미리 할당 된 공간의 위치를 ​​추적합니다.

적으로는, 내가 좋아하는 뭔가 쓰고 싶습니다

MyClass* c = New(mem) MyClass(3); // use memory manager instance 'mem' and constructor 'MyClass(int)' 

을하고 번역이 : 하나의 할당에 대한

MyClass* c = new (mem.Reserve<MyClass>()) MyClass(3); 

, 그리고 :

MyClass* c = New(mem) MyClass[33]; //use memory manager instance 'mem' and default constructor to initialize and array of 33 MyClass objects 

을로 번역 :

MyClass* c = new (mem.Reserve<MyClass>(33)) MyClass[33]; 

Reserve<TYPE>(SIZE) 메서드는 내부 매개 변수를 관리합니다. 사전 할당 된 메모리에 (sizeof(TYPE)*(SIZE)) 바이트를 예약하고 mem으로 관리하고 시작 주소의 포인터를 배치 새 함수에 반환합니다.

매크로를 실행할 수 있습니까? 아니면 이것에 접근하는 더 좋은 방법이 있습니까?

저는 ARM 컴파일러가 지원하는 C++ 03 표준으로 제한됩니다.

더 나은 이해를 돕기위한 조언과 예제를 보내 주시면 감사하겠습니다. 감사합니다.

+1

저는 그렇게 생각하지 않습니다. 매크로가 알고있는 것은 모두'()'안에 있고,':: operator new'는 어떠한 상황에서도 전달되는 타입을 알지 못합니다. Ergo, 매크로가 메모리를 요청하는 타입/범위를 찾을 방법이 없습니다. –

+0

단순히 기능을 사용하지 않는 이유는 무엇입니까? 'MyClass * c = mem.Reserve (33); –

+0

게재 위치 새 기능을 실행하는'mem.New (SIZE) '함수가 있습니다. 내 문제는 기본 생성자 만 하드 코딩 할 수 있다는 것입니다. 모든 생성자를 호출 할 수 있어야합니다. 그래서 제 생각은 New 함수를 제거하고 사용자가 직접 배치를 새로 사용하도록하는 것입니다. – radensb

답변

1

도움이 될 수 있습니다 다음은

#define New(mem, Type) new (mem.Reserve<Type>()) Type 
#define NewArray(mem, Type, Size) new (mem.Reserve<Type>(Size)) Type[Size] 

이 좋아 사용

MyClass* c = New(mem, MyClass)(3);  // new (mem.Reserve<MyClass>()) MyClass(3); 
MyClass* c = NewArray(mem, MyClass, 33); // new (mem.Reserve<MyClass>(33)) MyClass[33]; 

어쩌면 void* operator new(size_t n, MemoryManager& mem);을 정의하는 것은 (단지 크기를 알고있는 경우 Reserve<MyClass> 사용 MyClass)도 도움이 될 수 있습니다.