Pregunta

En cuanto a esta pregunta: ¿por qué un C / C ++ es necesario conocer el tamaño de una matriz en tiempo de compilación? se me ocurrió que los ejecutores del compilador debería haber tenido algunas veces para conseguir sus pies mojados ahora (es parte de la norma C99 , eso fue hace 10 años) y proporcionan una implementación eficiente.

Sin embargo, todavía parece (a partir de las respuestas) para ser considerado costoso.

Esto de alguna manera me sorprende.

Por supuesto, entiendo que un desplazamiento estático es mucho mejor que uno dinámico en términos de rendimiento, ya diferencia de una sugerencia que no me tienen realmente el compilador realizar una asignación del 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 coste

  • si no hay VLA en una función, entonces no habría ningún costo, por lo que puedo ver.
  • si hay una sola VLA, entonces uno cualquiera puede ponerlo antes o después de todas las variables, y por lo tanto obtener una compensación de la mayor parte del marco de pila estática (o al menos eso parece a mí, pero no estoy muy versado en la gestión de la pila)

La pregunta surge de múltiples VLA, por supuesto, y me preguntaba si tener una pila de VLA dedicada funcionaría. Este medio de que un VLA estarían representados por un recuento y un puntero (de tamaños conocidos, por lo tanto) y la memoria real tomada en una pila secundaria sólo se utiliza para este propósito (y por lo tanto realmente una pila también).

[reformulando]

¿Cómo se implementan VLA en gcc / VC ++?

Es el costo realmente tan impresionante?

[final reformulación]

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 de tamaño variable).

EDIT:

Hay una respuesta parcial aquí , sin embargo la comparación de VLA a las matrices tradicionales parecen injustas . Si supiéramos de antemano el tamaño, entonces no habría necesidad de un VLA. En la misma pregunta AndreyT dio algunas indicaciones relativas a la aplicación, pero no es tan preciso como me gustaría.

¿Fue útil?

Solución

  

¿Cómo se implementan VLA en gcc / VC ++?

Que yo sepa VC ++ no implementa VLA. Es un compilador de C ++ y sólo es compatible con C89 (sin VLA, no restringir). No sé cómo implementos gcc VLA, pero la forma más rápida posible es almacenar el puntero a la VLA y su tamaño en la parte estática de la pila-marco. De esta manera se puede acceder a uno de los VLA con el rendimiento de una matriz constante de tamaño (que es la última VLA si la pila crece hacia abajo como en x86 (eliminar la referencia [puntero de pila + índice * tamaño del elemento + el tamaño de los últimos empujones temporales]), y el primer VLA si crece hacia arriba (eliminar la referencia [StackFrame puntero + offset de StackFrame + índice * tamaño del elemento])). Todos los demás VLA necesitarán una vía indirecta más para obtener su dirección base de la parte estática de la pila.

[ Editar: también cuando se utiliza el compilador puede VLA puntero de pila-frame-base no omitir, que es redundante, de lo contrario, debido a que todos los desplazamientos desde el puntero de pila se pueden calcular en tiempo de compilación. Por lo que tiene un registro menos libre. - extremo editar ]

  

Es el costo realmente tan impresionante?

En realidad no. Por otra parte, si usted no lo utiliza, usted no paga por ello.

[ Editar: Probablemente una respuesta más correcta sería: ¿Comparado con qué? En comparación con un vector montón asignado, el tiempo de acceso será el mismo, pero la asignación y desasignación serán más rápidos. - extremo editar ]

Otros consejos

Si fuera a ser implementado en VC ++, yo asumiría el equipo compilador utilizar alguna variante de _alloca(size). Y creo que el costo es equivalente a usar variables con mayor que la alineación de 8 bytes en la pila (como __m128); el compilador tiene que almacenar en algún lugar del puntero de pila original, y la alineación de la pila requiere un registro adicional para almacenar la pila no alineado.

Así que la sobrecarga es básicamente una indirección adicional (hay que almacenar la dirección de VLA en algún lugar) y registrar la presión debido a algún lugar de almacenar la pila original de gama también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top