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