【发布时间】:2014-01-15 00:02:59
【问题描述】:
我正在尝试通过添加宏来简化库。我一直在阅读宏可以完成的所有不同事情,但是没有运气实现按我想要的方式工作的东西。
我写了一个内存管理器,用于放置新功能。它会跟踪分配的内容以及它在预分配空间中的位置。
理想情况下,我想写这样的东西:
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) 方法是管理内部参数的方法。它在mem管理的预分配内存中保留(sizeof(TYPE)*(SIZE))字节,并将起始地址的指针返回给placement new函数。
这对宏来说是可行的操作吗?还是有更好的方法来解决这个问题?
我仅限于 C++03 标准,因为这是我的 ARM 编译器支持的。
感谢任何建议和示例,以帮助我更好地理解这一点! 谢谢!
【问题讨论】:
-
我不这么认为。宏知道的一切都在
()中,而::operator new在任何情况下都不知道传递的类型。因此,宏无法找到请求内存的事物的类型/范围。 -
为什么不直接使用这个函数呢?
MyClass* c = mem.Reserve<MyClass>(33); -
我有一个函数 'mem.New
(SIZE)' 运行放置新函数。我的问题是我只能硬编码默认构造函数。我需要能够调用任何构造函数,所以我的想法是消除 New 函数并让用户直接使用placement new。 -
或者对
New进行更多的重载,并接受参数like this? (你可能也想要可变的参考版本,但这很快就会变得笨拙,除非你有像 boost do 这样的狡猾技术)
标签: c++ templates macros c++03