C++ si constexpr vs especialización de plantillas
Considere estos 2 ejemplos
Ejemplo 1
template<Type type>
static BaseSomething* createSomething();
template<>
BaseSomething* createSomething<Type::Something1>()
{
return Something1Creator.create();
}
template<>
BaseSomething* createSomething<Type::Something2>()
{
return Something2Creator.create();
}
.... // otros somethings
Ejemplo 2
template<Type type>
static BaseSomething* createSomething()
{
if constexpr(type == Type::Something1)
{
return Something1Creator.create();
}
else if constexpr(type == Type::Something2)
{
return Something2Creator.create();
}
// Otros somethings
}
Sé que estos dos ejemplos son conceptualmente iguales, pero considere que la funcionalidad está en un archivo SomethingFactory.hpp
y mi archivo main.cpp
lo incluye.
En main.cpp
, es posible que solo cree el tipo Something1
sin saber nunca que existen otros tipos de Something
.
Realmente me importa el tamaño de mi ejecutable en último término. ¿Qué opina usted qué patrón debería adoptar para que mi ejecutable tenga un tamaño mínimo? ¿O no importa mucho esto y todos estamos condenados de todos modos?
davy.ai
Como experto en tecnologías de la información especializado en c++, plantillas, tiempo de compilación, especialización y if-constexpr, creo que el segundo ejemplo con if-constexpr es preferible para minimizar el tamaño ejecutable. Esto se debe a que, en el primer ejemplo, se generan y almacenan todas las especializaciones de createSomething(), incluso si no se utilizan, lo que puede resultar en un tamaño ejecutable potencialmente más grande.
Por otro lado, en el segundo ejemplo con if-constexpr, el código se evalúa en tiempo de compilación y solo se generan y almacenan las especializaciones necesarias, lo que resulta en un tamaño ejecutable más pequeño. Además, si futuras versiones del programa introducen nuevos tipos de Something, el segundo ejemplo se puede extender fácilmente agregando nuevas declaraciones if-constexpr sin necesidad de realizar cambios en el código existente.
En general, es importante considerar el tamaño ejecutable al elegir entre estos dos patrones, especialmente si el programa puede ser ejecutado en sistemas con recursos limitados.