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.

Función en línea con uno de dos parámetros como constexpr.

Supongamos que tengo una función con dos parámetros donde el primer parámetro es dinámico pero el segundo parámetro siempre es constante y se conoce en tiempo de compilación:

“`c++
uint8_t convert_bcd(uint8_t num, uint8_t mask) {
uint8_t result = mask & 0x0F & num;

if constexpr ((mask & 0xF0) != 0) // mask se conoce en tiempo de compilación, puede ser optimizado
result += 10 * ((mask & 0xF0 & num) >> 4);

return result;
}

<pre><code><br />Ejemplo de uso:

“`cpp
uint8_t result1 = convert_bcd(data[0], 0x7F);
uint8_t result2 = convert_bcd(data[1], 0x3F);

Quiero en línea esta función (si es posible) y decirle al compilador que la condición “if”, que implica solo el segundo parámetro que siempre es constante, puede resolverse en tiempo de compilación.

Me confundí con “inline” / “const” / “constexpr” y cómo aplicarlos en mi escenario para optimizar la función tanto como sea posible.

¿Cuál es la forma idiomática adecuada de hacerlo en C ++?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para optimizar la función lo máximo posible, puede utilizar la palabra clave constexpr para indicar al compilador que la condición if que involucre el segundo parámetro se conoce en tiempo de compilación. Esto permite al compilador optimizar el código y eliminar la rama innecesaria en tiempo de ejecución. Además, también puede utilizar la palabra clave inline para sugerir al compilador que integre la función, lo que puede mejorar aún más el rendimiento eliminando la sobrecarga de la llamada a la función. Así es como puede modificar el código:

    “`c++
    inline constexpr uint8_t convert_bcd(uint8_t num, uint8_t mask) {
    uint8_t result = mask & 0x0F & num;

    if constexpr ((mask & 0xF0) != 0) // la máscara se conoce en tiempo de compilación, puede ser optimizada
        result += 10 * ((mask & 0xF0 & num) >> 4);
    
    return result;
    

    }
    “`

    Tenga en cuenta que la palabra clave constexpr se utiliza antes de la declaración de la función para indicar que la función puede evaluarse en tiempo de compilación si sus argumentos se conocen en tiempo de compilación. La palabra clave inline se utiliza antes de la definición de la función para sugerir al compilador que integre la función. El calificador const no es necesario aquí porque solo se aplica al valor de retorno de la función, que ya es un tipo integral y no se puede modificar.

Comments are closed.