¿Por qué C ++ permite matrices de longitud variable que no están asignadas dinámicamente?

Soy relativamente nuevo en C ++, y desde el principio me han enseñado que no puedes hacer algo como

int x; cin >> x; int array[x]; 

En cambio, debe usar memoria dinámica. Sin embargo, recientemente descubrí que lo anterior se comstackrá (aunque recibo una advertencia -pedante que dice que está prohibido por ISO C ++). Sé que obviamente es una mala idea hacerlo si no está permitido por el estándar, pero antes ni siquiera sabía que esto fuera posible.

Mi pregunta es, ¿por qué g ++ permite matrices de longitud variable que no están asignadas dinámicamente si no está permitido por el estándar? Además, si es posible que el comstackdor lo haga, ¿por qué no está en el estándar?

El soporte para matrices de longitud variable (VLA) se agregó al lenguaje C en C99.

Es probable que dado que el soporte para ellos exista en gcc (para admitir C99), fue relativamente sencillo agregar soporte para g ++.

Dicho esto, es una extensión de lenguaje específica para la implementación, y no es una buena idea usar extensiones específicas de la implementación si desea que su código sea portátil.

Porque es compatible con C99. Realmente no puedo hablar de por qué no está en el estándar de C ++. Sin embargo, no es tan útil como podría pensar, ya que lleva fácilmente (si no se tiene cuidado) al desbordamiento de la stack (ya que normalmente se basa en alloca , que a su vez no es estándar). Otro error es devolver un puntero a una matriz dinámica, que saldrá inmediatamente del scope.

Muchos comstackdores adoptan y amplían estándares. Hay dos razones básicas:

  1. Los infames comstackdores-escritores probablemente piensen que hacer más difícil alejarse de su comstackdor ayuda a boost la longevidad.
  2. Los comstackdores benévolos de comstackdores probablemente piensen que ofrecerles más opciones cuando pueden a poco o ningún costo para ellos mismos es algo bueno.

Todas las razones mencionadas que tienen que ver con que están en C son correctas, aunque existen limitaciones para el requisito. Su ejemplo puede mostrar un soporte más flexible que el requerido en C (si implementó eso usando scanf en lugar de cin, póngalo en un archivo .c y use gcc).

Esto es casi una simple llamada implícita a alloca (allocate auto) que simplemente disminuye el puntero de stack (aumentando el tamaño de stack) y copia el nuevo puntero de stack a otro registro que se utiliza como puntero a la memoria asignada.

La diferencia es que los constructores y los destructores no serán llamados a los objetos creados con una alloca.