【问题标题】:C++03 macro definitions with variables and types?带有变量和类型的 C++03 宏定义?
【发布时间】: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&lt; TYPE &gt;(SIZE) 方法是管理内部参数的方法。它在mem管理的预分配内存中保留(sizeof(TYPE)*(SIZE))字节,并将起始地址的指针返回给placement new函数。

这对宏来说是可行的操作吗?还是有更好的方法来解决这个问题?

我仅限于 C++03 标准,因为这是我的 ARM 编译器支持的。

感谢任何建议和示例,以帮助我更好地理解这一点! 谢谢!

【问题讨论】:

  • 我不这么认为。宏知道的一切都在() 中,而::operator new 在任何情况下都不知道传递的类型。因此,宏无法找到请求内存的事物的类型/范围。
  • 为什么不直接使用这个函数呢? MyClass* c = mem.Reserve&lt;MyClass&gt;(33);
  • 我有一个函数 'mem.New(SIZE)' 运行放置新函数。我的问题是我只能硬编码默认构造函数。我需要能够调用任何构造函数,所以我的想法是消除 New 函数并让用户直接使用placement new。
  • 或者对New 进行更多的重载,并接受参数like this? (你可能也想要可变的参考版本,但这很快就会变得笨拙,除非你有像 boost do 这样的狡猾技术)

标签: c++ templates macros c++03


【解决方案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&amp; mem); 也可能有所帮助(如果Reserve&lt;MyClass&gt; 使用MyClass 只是为了知道它的大小)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多