【问题标题】:Custom memory allocator design自定义内存分配器设计
【发布时间】:2012-08-30 17:50:25
【问题描述】:

我有一个内存分配器,它为一个对象分配内存并使用任何给定的参数调用它的构造函数,见下文。

    // 0 args to constructor
    template <class T>
    inline T* AllocateObject() { return new (InternalAllocate(sizeof(T), alignof(T))) T(); }

    // 1 args to constructor
    template <class T, typename arg0>
    inline T* AllocateObject(const arg0& a0) { return new (InternalAllocate(sizeof(T), alignof(T))) T(a0); }

    template <class T, typename arg0>
    inline T* AllocateObject(arg0& a0) { return new (InternalAllocate(sizeof(T), alignof(T))) T(a0); }

    // 2 args to constructor
    template <class T, typename arg0, typename arg1>
    inline T* AllocateObject(arg0& a0, arg1& a1) { return new (InternalAllocate(sizeof(T), alignof(T))) T(a0,a1); }

    template <class T, typename arg0, typename arg1>
    inline T* AllocateObject(const arg0& a0, arg1& a1) { return new (InternalAllocate(sizeof(T), alignof(T))) T(a0,a1); }

    template <class T, typename arg0, typename arg1>
    inline T* AllocateObject(arg0& a0, const arg1& a1) { return new (InternalAllocate(sizeof(T), alignof(T))) T(a0,a1); }

    template <class T, typename arg0, typename arg1>
    inline T* AllocateObject(const arg0& a0, const arg1& a1) { return new (InternalAllocate(sizeof(T), alignof(T))) T(a0,a1); }

    //.........

如您所见,调用次数随着参数数量的增加而迅速增长。我必须为每个参数交替使用“const”和“non-const”,以确保它与我通过的任何参数都能正常工作。 (特别是能够通过引用传递以及通过值传递)

有没有比重复这个方案更好的方法来执行相同的任务?基本上我正在研究最大 8-10 个参数之类的东西,我觉得它不太可行。

谢谢

【问题讨论】:

  • 如果您从不更改参数,只需使用 const type &amp; 一次处理所有 4 个版本。
  • C++11 适合您吗?它包含针对这个确切问题非常具体的语言更新。编辑:好吧,您使用的是alignof,我为没有仔细阅读而感到羞耻。 :) FireRain 的回答正是我所暗示的。
  • 不幸的是,C++11 不是一个选项
  • 你能举个例子吗?
  • 还有 - 如果对象的 c 构造函数可能会更改参数,那将如何工作?

标签: c++ templates memory-management


【解决方案1】:

您可以使用可变参数模板。

template <class T, class... Args>
inline T* AllocateObject(Args&&... args) {
    return new (InternalAllocate(sizeof(T), alignof(T)))
               T(std::forward<Args>(args)...);
}

std::forward 调用将保留所有引用和constness。


请注意,这需要 C++11。大多数最新的编译器已经支持可变参数模板(不过我不确定微软的)。

【讨论】:

  • 如果您需要强制执行最大数量的参数,static_cast 结合 sizeof args... 会很好地解决问题。
  • 太糟糕了,实际上还没有任何编译器真正支持它。 (我认为一个非常新版本的 gcc 有点作用)
  • @BobFincheimer,我在 GCC 上使用可变参数模板已经有一段时间了。不是回到 4.6.1 了吗?
  • @BobFincheimer clang 和 gcc 完全支持
  • @BobFincheimer GCC 和 clang 支持可变参数模板。我只是不确定 MSVC,它确实有问题。现在可能已经解决了,但我不使用 Windows。
【解决方案2】:

不是模板解决方案,而是变量参数#define 可以帮助您解决这个问题。
确切的格式取决于你的编译器,但在 MSVC 中它看起来像这样:

#define ALLOCATE_OBJECT(TYPE, ...) \
    ( new( InternalAllocate(sizeof(TYPE), alignof(TYPE)) ) TYPE(__VA_ARGS__) )

【讨论】:

    猜你喜欢
    • 2012-02-22
    • 2012-07-08
    • 2012-05-29
    • 1970-01-01
    • 2020-08-22
    • 2019-08-11
    • 2018-06-28
    • 1970-01-01
    • 2013-05-20
    相关资源
    最近更新 更多