【问题标题】:Generically overloading operator new while considering alignment requirements在考虑对齐要求时一般重载 operator new
【发布时间】:2019-04-10 05:31:13
【问题描述】:

情况

我正在为动态内存(取消)分配编写内存管理器。对于class A 在调用operator new(或delete)时使用它,class Aclass CustomAllocate 继承就足够了,newdelete 本身重载了使用内存管理器。

问题

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

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

模板class CustomAllocate 带有一个表示对齐要求的整数值并像这样继承:class A : public CustomAllocate< alignof(A) >

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

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

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

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


有什么可行的想法吗?

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • 好吧,重载运算符的关键在于我不必对现有的 new/delete 调用进行任何更改:我可以在标准的 new/delete 和我自己的内存管理(使用放置new internal) 通过更改 CustomAllocate 的继承或实现。您的建议将迫使我更改许多现有调用,或者,在我想使用 CustomAllocate 的每个类中重载新删除,这是我打算规避的。
    • 更新了我的答案
    • “有点令我惊讶”。使用 CRTP,T 在类定义期间不完整,但在方法定义内部不完整。
    • @PaulSanders 谢谢,你的想法做到了。我以前不知道 CRTP (en.wikipedia.org/wiki/Curiously_recurring_template_pattern),有趣的是你是如何在不知道的情况下建议它的。
    猜你喜欢
    • 2011-01-22
    • 2011-07-13
    • 2011-08-30
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    相关资源
    最近更新 更多