我试图通过添加宏来简化库。我一直在阅读宏可以完成的所有不同的事情,但没有运气实现一些按我想要的方式工作的东西。
我写了一个与放置新功能一起使用的内存管理器。它会跟踪分配的内容以及预分配空间中的位置。
理想情况下,我想写一些类似的东西:
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
个字节,并将起始地址的指针返回到放置新函数。
这是宏的可行操作吗?或者有更好的方法来解决这个问题吗?
我仅限于C ++ 03标准,因为这是我的ARM编译器所支持的。
我感谢任何建议和例子,以帮助我更好地理解这一点! 谢谢!
答案 0 :(得分: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
知道其大小)。