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 ++?
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 claveinline
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;
}
“`
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 claveinline
se utiliza antes de la definición de la función para sugerir al compilador que integre la función. El calificadorconst
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.