C++ 考虑对齐要求时,一般重载运算符为新运算符 处境

C++ 考虑对齐要求时,一般重载运算符为新运算符 处境,c++,alignment,operator-overloading,new-operator,generic-programming,C++,Alignment,Operator Overloading,New Operator,Generic Programming,我正在为动态内存(de)分配编写一个内存管理器。对于调用运算符new(或delete)时使用类a的来说,从类CustomAllocate继承就足够了,该类本身以使用内存管理器的方式重载新建和删除 问题 然而,显然我完全忽略了对齐要求。不幸的是,CustomAllocate::new没有关于继承自它的class a如何对齐的信息,因为唯一的参数是请求的内存大小。我正在寻找一种方法,以便在使用内存管理器时,在每个a类中包含对齐信息,而不必重载新建(和删除) 想法1(以及为什么它不起作用) 使用表示对

我正在为动态内存(de)分配编写一个内存管理器。对于调用
运算符new
(或
delete
)时使用
类a
来说,从
类CustomAllocate
继承就足够了,该类本身以使用内存管理器的方式重载
新建
删除

问题 然而,显然我完全忽略了对齐要求。不幸的是,
CustomAllocate::new
没有关于继承自它的
class a
如何对齐的信息,因为唯一的参数是请求的内存大小。我正在寻找一种方法,以便在使用内存管理器时,在每个
a类
中包含对齐信息,而不必重载
新建
(和
删除

想法1(以及为什么它不起作用) 使用表示对齐要求的整数值模板化
class CustomAllocate
,并像这样继承:
class A:public CustomAllocate

不可能,因为在必须将其作为模板参数传递时,
alignof(A)
无法知道,即使传递的参数不应改变
A类
的对齐要求

想法2(以及为什么它不起作用) 具有纯虚拟函数
virtual int CustomAllocate::getAlignment()=0
,通过复制粘贴类似
返回(a)的内容在每个
类中实现

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



有什么可行的想法吗?

让我有点惊讶的是,以下建议似乎奏效了:

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);
    }
};

嗯,重载运算符的要点是我不必对现有的new/delete调用进行任何更改:我可以通过更改继承或CustomAllocate的实现,在标准new/delete和我自己的内存管理(内部使用placement new)之间进行切换。你的建议会迫使我改变很多现有的调用,或者,在我想使用CustomAllocate的每个类中,重载新的delete,这正是我想要回避的。更新了我的答案“有点出乎意料”。使用CRTP时,
T
在类的定义过程中是不完整的,但在方法的定义中是不完整的。@PaulSanders谢谢你,你的想法做到了。我以前不知道CRTP(),有趣的是,你是如何在似乎不知道的情况下提出它的。
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