在考虑对中要求的同时,使操作员普遍超载

时间:2018-11-06 19:06:46

标签: c++ alignment operator-overloading new-operator generic-programming

情况

我正在编写用于动态内存分配的内存管理器。为了让class A在调用operator new(或delete)时使用它,class A可以从class CustomAllocate继承,而new本身会重载{ {1}}和delete以使用内存管理器的方式。

问题

但是,显然我完全错过了对齐要求。不幸的是,CustomAllocate::new没有关于class A继承的信息,因为唯一的参数是请求的内存大小。我正在寻找一种包括对齐信息的方法,而不必在每个new中重载delete(和class A)来使用内存管理器。

想法1(以及为什么不起作用)

使用表示对齐要求的整数值对class CustomAllocate进行模板处理,并像这样class A : public CustomAllocate< alignof(A) >进行继承。

不可能,因为alignof(A)在必须作为模板参数传递时是未知的,即使传递的参数从不改变class A的对齐要求。

想法2(以及为什么不起作用)

具有一个纯虚函数virtual int CustomAllocate::getAlignment() = 0,该函数通过复制粘贴class A之类的方法在每个return alignof(A);中实现。

不可能,因为new是静态的,因此永远无法访问虚拟函数。


任何可行的想法吗?

1 个答案:

答案 0 :(得分:1)

令我惊讶的是,以下方法似乎有效:

template <typename T> class CustomAllocate
{
public:
    void* operator new (std::size_t count)
    {
        std::cout << "Calling new, aligment = " << alignof (T) << "\n";
        return aligned_alloc (alignof (T), count);
    }

    void operator delete (void *p)
    {
        std::cout << "Calling delete\n";
        free (p);
    }
};

测试程序:

class A : public CustomAllocate <A>
{
public:
    A (int a, int b) : a (a), b (b) { }
    int a, b;
};

int main ()
{
    A *x = new A (1, 2);
    std::cout << x->a << ", " << x->b << "\n";
    delete x;
}

输出:

Calling new, aligment = 4
1, 2
Calling delete

Live Demo