具有模板方法的C ++类,其中许多实例在编译时消耗大量内存

时间:2017-07-14 13:14:51

标签: c++ qt templates qxorm

我有一个带有模板方法的类,我实例化了许多其他类,比如一百多个。问题是模板类的编译会占用大量内存,比如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);

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

也许你应该考虑让所有处理类实例注册SGSHandler类,这样就可以了

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

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

答案 2 :(得分:-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);
}