-1

我有一个带有模板方法的类,用于实例化许多其他类,比如一百多个。问题是模板类的编译消耗了大量的内存,比如3GB。我认为这是由于许多模板实例而发生的。只是为了详细说明,实例化的类是 Qt 和 QxOrm 对象。其他人也有这个问题吗?有人建议我如何减少内存消耗?

以下是部分代码:

//The class with template methods

class SGSRequestHandler : public HttpRequestHandler
{
    public:
        SGSRequestHandler(QObject* parent = 0);
        virtual ~SGSRequestHandler();

        template<class T>
        ResponseInfo processDatabase(ODataRequestInfo<T>& odata, qx::QxSession& session) {...}

        template<class T>
        ResponseInfo httpGet(ODataRequestInfo<T> &odata, qx::QxSession& session) {...}
    ...
   }


//Here is a example of what I do with de template class:

else if (className == "class1")
     rInfo = process<Class1>(request, session);
else if (className == "class2")
     rInfo = process<Class2>(request, session);
...
else if (className == "class100")
    rInfo = process<Class100>(request, session);
4

3 回答 3

1

查看您的解决方案表明,真正的模板是您问题的错误答案。

也许您应该考虑使所有处理类实例都向该类注册SGSHandler,这样就可以了

processors_[name].process(request, session);

这显然有运行时成本,但维护起来要容易得多

于 2017-07-18T15:52:20.023 回答
0

最简单的解决方案很可能是使用extern template100 个实例并将其移动到多个 .cpp 文件中。

于 2017-07-14T13:32:52.847 回答
-1

我有一个解决方案。甚至没有接近优雅,但解决了我的问题。

我只是将实例化所有模板的类拆分为其他三个类。因此,编译时的内存消耗是每个类的第三部分。

记住我需要使用模板,因为我使用的是 QxOrm 库,否则我可以使用 polimorfism 以更简单的方式完成此操作。

//processorr.h

class ProcessorR {
    void process(const QString& className) {
        if(className == "rClass1")
            rInfo = process<rClass1>(request, session);
        else if(className == "rClass2")
            rInfo = process<rClass2>(request, session);
        /// And so on
    }
}

//processort.h

class ProcessorT {

    void process(const QString& className) {
        if(className == "tClass1")
           rInfo = process<tClass1>(request, session);
        else if(className == "tClass2")
           rInfo = process<tClass1>(request, session);
        /// And so on
    }
}

//And then in usage:

if(className.startsWith("t"))
{
    ProcessorT processor;
    processor.process(className);
}
else if(className.startsWith("r"))
{
    ProcessorR processor;
    processor.process(className);
}
else if(className.startsWith("u"))
{
    ProcessorU processor;
    processor.process(className);
}
于 2017-07-18T15:40:34.667 回答