Класс шаблона и возможные проблемы с производительностью

Если я использую шаблонный класс для создания 30 различных определений. Мой вопрос заключается в том, что он будет скомпилирован в 30 фактических классов в двоичном (двоичный размер = sizeof (template_class) х 30), хотя их фактический код очень похожи или даже точно так же?

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

    template<typename msg_policy, int id>
class temp_class_test : public msg_policy
//codes, methods, and members
};

template class temp_class_test<A_policy,1>;
template class temp_class_test<B_policy, 2>;

3

Решение

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

Вы можете смягчить это так, как предложил Уолтер в комментариях: имея реализацию в некотором общем базовом классе, из которого происходят все другие классы. Я подробно рассказал об этой технике в моем ответе на вопрос «Как определить разные типы для одного и того же класса в C ++».

2

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

Если ваши 30 с лишним классов очень похожи, вам следует избегать дублирования кода. Например, параметр шаблона id может быть просто заглушка, чтобы различать идентичные классы. В этом случае вам не нужно переопределять класс для каждого id, но может просто наследовать от реализации:

namespace implementation {
template<typename p> class test {
// implementation
};
}
template<typename p, int id>
class temp_class_test : public implementation::test<p>
{
// any additional code dependent on id
// any non-inheritable code (constructors)
};

Затем компилятор сгенерирует только один двоичный файл для каждого метода базового класса и id просто служит для различения разных temp_class_test,

2

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

0
По вопросам рекламы [email protected]