¿Cuál fue el razonamiento detrás de no almacenar explícitamente la longitud de una matriz con una matriz en C
?
A mi modo de ver, hay razones abrumadoras para hacerlo pero no muchas en apoyo de la norma (C89). Por ejemplo:
- Tener una longitud disponible en un búfer puede evitar el desbordamiento del búfer.
- Un
arr.length
al estilo de Java es claro y evita que el programador tenga que mantener muchosint
s en la pila si se trata de varios arreglos - Los parámetros de la función se vuelven más convincentes.
Pero tal vez la razón más motivadora, en mi opinión, es que generalmente no se guarda ningún espacio sin mantener la longitud. Me atrevería a decir que la mayoría de los usos de los arreglos implican una asignación dinámica. Es cierto que puede haber algunos casos en los que las personas utilicen una matriz asignada en la pila, pero esa es solo una llamada de función *: la pila puede manejar 4 u 8 bytes adicionales.
Ya que el administrador del montón tiene que rastrear el tamaño de bloque libre usado por la matriz asignada dinámicamente de todos modos, ¿por qué no hacer que esa información sea utilizable (y agregar la regla adicional, verificada en el momento de la compilación, que no se puede manipular la longitud explícitamente)? a menos que uno quisiera dispararse en el pie).
Lo único que se me ocurre en el otro lado es que no es posible que el seguimiento de la longitud haya hecho que los compiladores sean más simples, pero no que sea mucho más simple.
* Técnicamente, uno podría escribir algún tipo de función recursiva con una matriz con almacenamiento automático, y en este caso (muy elaborado), el almacenamiento de la longitud puede efectivamente resultar en un mayor uso del espacio.