我的代码中有不同的内存分配器:一个用于CUDA(托管与否),一个用于纯主机内存.我还可以设想一种情况,当你想要使用不同的分配算法时 - 例如,一个用于大型长生活区块,另一个用于短生活,小型对象.
我想知道如何正确实施这样一个系统.
安置新的?
我当前的解决方案使用placement new,其中指针决定使用哪个内存和内存分配器.删除/取消分配对象时必须小心.目前,它的工作原理,但我认为这不是一个好的解决方案.
MyObj* cudaObj = new(allocateCudaMemoryField(sizeof(MyObj)) MyObj(arg1, arg2);
MyObj* hostObj = new(allocateHostMemoryField(sizeof(MyObj)) MyObj(arg1, arg2);
Run Code Online (Sandbox Code Playgroud)
重载新,但如何?
我想找一个重载new运算符的解决方案.看起来如下:
MyObj* cudaObj = CudaAllocator::new MyObj(arg1, arg2);
MyObj* hostObj = HostAllocator::new MyObj(arg1, arg2);
CudaAllocator::delete cudaObj;
HostAllocator::delete hostObj;
Run Code Online (Sandbox Code Playgroud)
我想我可以通过拥有一个命名空间来实现这一点,CudaAllocator并且HostAllocator每个都有一个重载new和delete.
两个问题:
new在代码中有不同的重载是否合理,或者这是设计缺陷的标志?我试图实现这个:
namespace Test
{
void* operator new(size_t s)
{
return malloc(s);
}
}
Run Code Online (Sandbox Code Playgroud)
但是g ++(4.3.1)说:
void* Test::operator new(size_t)’ may not be declared within a namespace
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?
如果是的话,是否还有重载操作符new以在我的类中使用?我不想创建一个基类,并让我的所有类继承自这样的基类.