qt — класс C ++ с шаблонными методами, имеющими много экземпляров, занимающих огромное количество памяти при компиляции

У меня есть класс с шаблонными методами, для которых я создаю множество других классов, например, более ста. Проблема в том, что компиляция шаблонного класса потребляет огромное количество памяти, например 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);

-1

Решение

Самым простым решением может быть использование extern template и переместите 100 экземпляров в несколько файлов .cpp.

0

Другие решения

Глядя на ваше решение, можно предположить, что шаблоны действительно являются неправильным ответом на вашу проблему.

Возможно, вам следует рассмотреть возможность регистрации всех экземпляров класса обработки в SGSHandler класс, так что это может просто сделать

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

Очевидно, что это требует затрат времени выполнения, но гораздо проще поддерживать

0

Я пришел с решением. Даже близко не изящный, но решил мою проблему.

Я просто разделил класс, который создает экземпляр шаблона на три других класса. Итак, потребление памяти при компиляции является третьей частью для каждого из классов.

Помня, что мне нужно работать с шаблонами, потому что я использую библиотеку 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);
}
-1
По вопросам рекламы [email protected]