代码之家  ›  专栏  ›  技术社区  ›  user541686

如何测试分配器是否使用std::allocate进行内存分配?

  •  0
  • user541686  · 技术社区  · 13 年前

    我想为使用完成的分配提供专门的优化 std::allocator ,但如果有人将其子类化 没有 最重要的 allocate deallocate ,那么我不知道如何检测他们是否仍在使用 std::分配器 或者不。

    我该怎么做?

    1 回复  |  直到 13 年前
        1
  •  2
  •   user541686    13 年前

    假设他们还没有定义自己 allocate deallocate 函数,则一种测试方法是测试值

    is_default_allocator_allocation<allocator_type>::value
    

    以测试 分配 解除分配 方法是默认的方法。

    如果他们 提供了自己的功能,那么就没有通用的测试方法。

    这个解决方案确实 看看其他方法。
    它可以偶尔给你假阴性,但不应该给你假阳性。

    我的实施:

    template<class Ax> char (&is_default_deallocate(void (std::allocator<typename Ax::value_type>::*)(typename Ax::pointer, typename Ax::size_type)))[1];
    template<class Ax> char (&is_default_deallocate(void (Ax::*)(typename Ax::pointer, typename Ax::size_type)))[2];
    template<class Ax> char (&is_default_allocate(typename Ax::pointer (std::allocator<typename Ax::value_type>::*)(typename Ax::size_type, void const *)))[1];
    template<class Ax> char (&is_default_allocate(typename Ax::pointer (Ax::*)(typename Ax::size_type, void const *)))[2];
    
    template<class Ax>
    struct is_default_allocator_allocation  // tests allocate() and deallocate()
    {
        static bool const value =
            sizeof(is_default_deallocate<Ax>(&Ax::deallocate)) == sizeof(char)
            && sizeof(is_default_allocate<Ax>(&Ax::allocate)) == sizeof(char);
    };