Al ver esta pregunta: Why does a C/C++ compiler need know the size of an array at compile time ? se me ocurrió que los implementadores de compiladores deberían haber tenido algunas veces para mojarse ahora (es parte del estándar C99, eso es hace 10 años) y proporcionar implementaciones eficientes.¿Sobrecarga de la matriz de longitud variable en C++?
Sin embargo, parece que (de las respuestas) se considera costoso.
Esto de alguna manera me sorprende.
Por supuesto, entiendo que una compensación estática es mucho mejor que una dinámica en términos de rendimiento, y a diferencia de una sugerencia, en realidad no haría que el compilador realizara una asignación de montón de la matriz ya que esto probablemente costaría aún más [esto no se ha medido;)]
pero todavía estoy sorprendido por la supuesta costo:
- si no hay VLA en una función, entonces no habría ni ningún coste, en la medida Puedo ver.
- si hay un único VLA, entonces uno puede ponerlo antes o después de todas las variables, y por lo tanto obtener un desplazamiento estático para la mayoría del marco de pila (o eso me parece, pero no estoy bien versado en la gestión de pila)
La pregunta surge de múltiples VLA, por supuesto, y me preguntaba si funcionaría una pila de VLA dedicada. Esto significa que un VLA se representaría mediante un conteo y un puntero (de tamaños conocidos, por lo tanto) y la memoria real tomada en un apilamiento secundario solo utilizado para este fin (y, por lo tanto, realmente también una pila).
[reformulando]
¿Cómo se implementan VLA en gcc/VC++?
¿Es realmente tan impresionante el costo?
[reformulación final]
Me parece que sólo puede ser mejor que el uso de, digamos, un vector
, incluso con las implementaciones actuales, ya que no se incurre en el costo de una asignación dinámica (a costa de no ser redimensionable).
EDIT:
Hay una respuesta parcial here, sin embargo, que comparan a VLA matrices tradicionales parece injusto. Si supiéramos el tamaño de antemano, entonces no necesitaríamos un VLA. En la misma pregunta, AndreyT dio algunos consejos sobre la implementación, pero no es tan preciso como me gustaría.
@Matthieu M. Eliminado. Debo estar pensando en otra cosa. –
@ Matthieu: piensas que me parece sano ... VLA solo sugiere una sobrecarga cuando hay más de 1 (simplemente colocándolo "después" de elementos de tamaño conocido, y luego podría haber un puntero o ajuste adicional en la pila de compensación conocida para indicar dónde se inician los VLA subsiguientes. Sin embargo, no puedo ver una segunda pila ayudando. –
@Tony: Me preguntaba cómo se implementa la pila, si la implementación significa que solo la parte superior actual de la pila está Conocido, entonces usted tiene un cálculo de desplazamiento dinámico, al parecer, a menos que use una segunda pila para almacenar los elementos VLA. Si conoce tanto la parte superior como la inferior del cuadro actual, entonces para el elemento VLA individual es fácil. De todos modos, ' Simplemente me gustaría saber cómo se hace (actualmente) y cuál es el "costo". –