У меня есть класс с шаблонными методами, для которых я создаю множество других классов, например, более ста. Проблема в том, что компиляция шаблонного класса потребляет огромное количество памяти, например 3 ГБ. Я предполагаю, что это происходит из-за многих экземпляров шаблона. Просто для детализации, созданными экземплярами классов являются объекты Qt и QxOrm.
У somenone еще была эта проблема тоже?
Некоторые предполагают, как я могу уменьшить потребление памяти?
Вот некоторые части кода:
//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);
Самым простым решением может быть использование extern template
и переместите 100 экземпляров в несколько файлов .cpp.
Глядя на ваше решение, можно предположить, что шаблоны действительно являются неправильным ответом на вашу проблему.
Возможно, вам следует рассмотреть возможность регистрации всех экземпляров класса обработки в SGSHandler
класс, так что это может просто сделать
processors_[name].process(request, session);
Очевидно, что это требует затрат времени выполнения, но гораздо проще поддерживать
Я пришел с решением. Даже близко не изящный, но решил мою проблему.
Я просто разделил класс, который создает экземпляр шаблона на три других класса. Итак, потребление памяти при компиляции является третьей частью для каждого из классов.
Помня, что мне нужно работать с шаблонами, потому что я использую библиотеку QxOrm, я мог бы сделать это намного проще с помощью полиморфизма.
//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);
}