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

时间:2012-08-20 23:23:32

标签: c++ allocator

我想为使用std::allocator完成的分配提供专门的优化,但是如果有人将子类化为而没有覆盖allocatedeallocate,那么我就不会我知道如何检测他们是否仍在使用std::allocator

我该怎么做?

1 个答案:

答案 0 :(得分:1)

假设他们没有定义自己的allocatedeallocate函数,那么测试的一种方法是测试值

is_default_allocator_allocation<allocator_type>::value

测试allocatedeallocate方法是否为默认方法。

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

此解决方案查看其他方法 它可以偶尔给你带来假阴性,但不应该给出误报。

我的实施:

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