Если я использую шаблонный класс для создания 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>;
В своем нынешнем виде классы, созданные в вашем шаблоне, являются различными классами с различным кодом. И да, это приведет к тому, что код будет перезагружаться снова и снова при исполнении.
Вы можете смягчить это так, как предложил Уолтер в комментариях: имея реализацию в некотором общем базовом классе, из которого происходят все другие классы. Я подробно рассказал об этой технике в моем ответе на вопрос «Как определить разные типы для одного и того же класса в C ++».
Если ваши 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
,
Вскрытие сделано. Вот почему мое приложение работает так плохо, когда оно находится в состоянии стресса. Это было потому, что мой процессор был испытан навсегда пропустить кэш.