Inicialización de matriz use la variable const en C ++

  1. esto puede funcionar:

    const int size = 2; int array[size] = {0}; 
  2. esto tiene un error de comstackción:

     int a = 2; const int size = a; int array[size] = {0}; 

¿por qué?

Porque los chicos del comité de C ++ así lo decidieron.

La razón técnica es que la primera expresión que se utiliza para inicializar el size es una expresión constante y se puede calcular durante la comstackción. Esto significa que el comstackdor también puede saber qué tan grande será la matriz y la asignación (en este caso “reserva” puede ser un término más apropiado) se puede hacer en tiempo de comstackción.

En el segundo caso, en cambio, la expresión no es una expresión constante (dada la definición de C ++) y esta revervación no es posible.

El hecho de que en el segundo caso el valor efectivamente se haya fijado por el size del tiempo inicializado es totalmente irrelevante. Las reglas se basan en el “tipo de expresión” y la segunda expresión usa variables mutables y, por lo tanto, el comstackdor considera que no es constante.

Permitir el segundo formulario de inicialización en tiempo de comstackción requerirá un análisis de flujo porque necesitaría distinguir entre

 int a = 2; const int size = a; 

y

 int a = foo(); const int size = a; 

donde la expresión que involucra size es de hecho idéntica.

 const int size = 2; int array[size] = {0}; 

Aquí, 2 es un valor literal, es decir, no puede cambiarlo, y el comstackdor conoce el valor en tiempo de comstackción.

 int a = 2; const int size = a; int array[size] = {0}; 

Sin embargo, a es una variable, lo que significa que el valor a podría cambiar y estará seguro en tiempo de ejecución. Por lo tanto, el comstackdor lo prohíbe. Puedes usar

 int a = 2; int size = a; int* array = new int[size]; 

por lo tanto, puede solicitar una matriz con tamaño dynamic.

Se trata de la gestión de la memoria.

Cuando OS intente ejecutar su progtwig debido a la naturaleza de C ++, el sistema operativo querrá saber el espacio exacto para el área de la stack . En el primer ejemplo, OS sabrá que el valor de la variable no va a cambiar. Pero para un segundo ejemplo a la vista del sistema operativo, su primera variable, que es “a”, puede cambiar entre

 int a = 2; 

esto y esto

 const int size = a; 

tu variable a puede ser cambiable. Es por eso que su comstackdor no le permite comstackr su código.

Para aprender más sobre los principios básicos de administración de memoria. Te recomiendo que https://stackoverflow.com/a/24922/2326288 este comentario.

Porque en el primer caso, el comstackdor inicializa el size en el momento de la comstackción. En el segundo caso, a puede inicializarse en tiempo de ejecución y, por lo tanto, el size también se inicializará en el tiempo de ejecución y ya no será una constante de tiempo de comstackción.