跟踪模板类的内存消耗

时间:2017-04-25 10:03:24

标签: c++ c++11 template-specialization

我有一个课程,我想估计它消耗了多少内存:

success: function() { 
        $(".full-wrapper").html(data); 
    }
});

这很好用。最近我被要求支持success: function(data) { ^^^^ the returned data $(".full-wrapper").html(data); } }); 。 当前实现不起作用,因为template <typename T, typename U> class MyTemplateClass { size_t EstimateMemoryConsumption() const { // the memory consumption is a function of the size of the first template argument return f(sizeof(T)); } } 不反映T == std::string的内存消耗(我需要在sizeof(std::string)上调用std::string)。根据{{​​3}},我无法对成员函数进行部分专业化(适用于capacity()和任何std::string

有没有不同的方法来实现这一目标?

2 个答案:

答案 0 :(得分:2)

您可以将内存消耗作为模板参数本身的函数。

template <typename T, typename U>
class MyTemplateClass
{
    size_t EstimateMemoryConsumption() const
    {
        return estimate<T>(my_data_member);
    }
};

template <typename T>
size_t estimate(const T&) noexcept { return sizeof(T); }

template <>
size_t estimate<std::string>(const std::string& x) noexcept 
{ 
    return x.capacity(); 
}

答案 1 :(得分:1)

使用特征来实现专业化:

template <typename T>
class MyTemplateClassTraits
{
public:
    static size_t EstimateMemoryConsumption(T& member)
    {
        return 0; // implement...
    }
};

template <>
class MyTemplateClassTraits<std::string>
{
public:
    static size_t EstimateMemoryConsumption(std::string& member)
    {
        return 0;  // implement...
    }
};

无需更改当前的API:

template <typename T, typename U>
class MyTemplateClass
{
    //...

    size_t EstimateMemoryConsumption() const
    {
        // the memory consumption is a function of the size of the first template argument
        return MyTemplateClassTraits<T>::EstimateMemoryConsumption(t_data_member);
    }

    //...
}