es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for 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.

Comments are closed.