相关疑难解决方法(0)

在一个C++程序中有不同的新运算符:如何?馊主意?

我的代码中有不同的内存分配器:一个用于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每个都有一个重载newdelete.

两个问题:

  • new在代码中有不同的重载是否合理,或者这是设计缺陷的标志?
  • 如果没关系,如何最好地实现它?

c++ memory cuda new-operator

9
推荐指数
1
解决办法
296
查看次数

Test :: operator 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以在我的类中使用?我不想创建一个基类,并让我的所有类继承自这样的基类.

c++

1
推荐指数
1
解决办法
1052
查看次数

标签 统计

c++ ×2

cuda ×1

memory ×1

new-operator ×1