ProgramaciónDesarrollador C++ Embedded

¿Puede hablar sobre cómo funcionan la constancia de tiempo de compilación y de enlace en C++. ¿Cuál es la diferencia entre constexpr y const? ¿Cuándo usar cada uno de ellos?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

En C++ existen constantes de tiempo de compilación y de tiempo de enlace.

  • La variable const es un objeto que no se puede modificar después de la inicialización. Pero const no siempre garantiza que el valor sea conocido en tiempo de compilación; puede ser calculado solo en tiempo de ejecución.
  • constexpr garantiza que la expresión o función se calculará en tiempo de compilación.

Ejemplo:

const int x = time(0); // const, pero NO constexpr: el valor se calcula en tiempo de ejecución constexpr int y = 2 + 2; // constexpr: conocido en tiempo de compilación constexpr int square(int x) { return x * x; } int arr[square(3)]; // tamaño del arreglo — expresión de tiempo de compilación

Use constexpr para expresiones constantes que deben estar disponibles para el compilador, por ejemplo, para los tamaños de arreglos o parámetros de plantilla.

Pregunta capciosa.

¿Puede una función declarada como constexpr ser llamada con argumentos no constantes?

Respuesta: ¡Sí! Si los argumentos son conocidos en tiempo de compilación, el resultado se calculará en ese momento. Si los argumentos solo son conocidos en tiempo de ejecución, la función se calculará como una normal.

constexpr int double_val(int x) { return x * 2; } int val = std::rand(); int result = double_val(val); // Se llamará en tiempo de ejecución

Ejemplos de errores reales por falta de conocimiento de los matices del tema.


Historia

Uno de los módulos estableció el tamaño del arreglo a través de const int, pensando que era una constante de tiempo de compilación. En otro compilador, esto causó un error, porque el valor se calculó en tiempo de ejecución y el tamaño del arreglo no cumplió con el estándar.


Historia

En el cálculo de hashes, el compilador no pudo optimizar los cálculos porque se utilizaba una variable const, en lugar de constexpr. Resultado: disminución del rendimiento en más de 2 veces en las nuevas versiones.


Historia

Al migrar a estándares modernos, se confundieron las palabras clave y declararon la función como const, en lugar de constexpr, lo que impidió usar el resultado en expresiones de plantilla en tiempo de compilación. Un diagnóstico rápido mostró el error, pero en la revisión fue a la rama principal.