una - ¿Por qué C++ no admite matrices dinámicas en la pila?
matriz dinamica c++ (2)
En C99 esto era legal:
void f(size_t sz) {
char arr[sz];
// ...
}
Sin embargo, esto (matrices de apilamiento de tamaño dinámico) se ha eliminado en C ++ y no se ha visto ningún rendimiento en C ++ 11.
AFAIK C ++ se creó teniendo en cuenta la compatibilidad con C, por lo que me pregunté: Debe haber algún argumento muy bueno para no incluir esta característica útil, ¿verdad?
Todo lo que pude pensar fue esto:
Pros
- Ahorro de memoria al permitir tamaños de matriz más inteligentes que deben estar en la pila (¿búferes temporales?).
- Menos "punteros inteligentes" (o, lo que es peor, la
delete []
manual de errores,delete []
''s) y ralentizar las asignaciones del montón. - Compatibilidad con C99.
Contras
- Permite que las personas asignen fácilmente matrices demasiado grandes en la pila, lo que genera desbordamientos de pila difíciles de depurar.
- Más complicado para los escritores compiladores.
Entonces, ¿por qué no lo incluyeron cuando importaron otras funciones de C99?
Para evitar que esto se cierre como "subjetivo" o "no constructivo", estoy buscando citas de miembros del comité o enlaces a discusiones que hablen sobre el tema, con puntos de bonificación para un resumen rápido de SO, por supuesto.
En lugar de ver esto como una discusión entre ponis y hámsters , véala como una pregunta histórica, mero interés en las ventajas y desventajas que se consideraron (si es que lo hubo).
EDITAR : Como James McNellis señaló en los comentarios a continuación, C ++ existía antes de las matrices de longitud variable estandarizadas de C99. Puede leer mi pregunta entonces como: " ¿Por qué no lo hicieron y no lo agregarán? ".
Creo que es porque C ++ proporciona soluciones superiores: std::vector<T>
y std::array<T,N>
(C ++ 11); aunque este último no es dinámico como tal, pero es superior a las matrices en bruto. Siempre puede saber el tamaño, sin importar qué función pase el vector o la matriz.
Como C no puede proporcionar estas soluciones, C99 creó una matriz de longitud variable (VLA). Tiene el mismo problema que las matrices regulares: se descompone en un puntero al pasarlo a la función, y ya no sabe el tamaño de la matriz.
Y como Florian Weimer preguntó here en comp.std.c++
que si C ++ 0x permite VLA, ¿qué significaría el siguiente código?
int vla[n]; //n is known at runtime!
std::vector<decltype(vla)> v; //what does this mean?
¿Cómo va a crear el compilador una instancia de la plantilla vectorial en tiempo de compilación cuando el argumento de tipo depende de n
que se conoce en tiempo de ejecución?
Esta funcionalidad duplica en gran medida la de std::vector
, excepto que consume un recurso más limitado (espacio de pila frente a montón). Como tal, no hay realmente ninguna necesidad en C ++, en lo que respecta a la semántica.
Se podría argumentar que la asignación en la pila puede mejorar la eficiencia (especialmente en el caso de múltiples subprocesos); sin embargo, esto también se puede lograr en C ++ utilizando asignadores personalizados para crear un grupo de memoria privada, ya sea en la pila o en el montón. De nuevo, esto es más flexible que colocar memoria en la pila y, de hecho, podría crear un asignador personalizado que extraiga fragmentos de un búfer de memoria en la pila con la suficiente facilidad. No es exactamente lo mismo que la semántica de matrices dinámicas, pero la existencia de asignadores personalizados y contenedores STL cubre la mayoría de los casos de uso que se desean asignar a la pila.