¿Por qué no se pueden pasar matrices como argumentos de función en C?

12

Siguiendo a este comentario , he intentado google por qué, pero mi google-fu falló.

Comentario del enlace:

  

[...] Pero lo importante es que las matrices y los punteros son cosas diferentes en C.

     

Suponiendo que no está utilizando ninguna extensión de compilador, generalmente no puede pasar una matriz a una función, pero puede pasar un puntero e indexar un puntero como si fuera una matriz.

     

Se está quejando efectivamente de que los punteros no tienen una longitud adjunta Debería quejarse de que las matrices no se pueden pasar como argumentos de función, o que las matrices se degradan a los punteros de forma implícita.

    
pregunta Florian Margaine 20.06.2014 - 18:53

2 respuestas

18

Mi primera suposición por la razón fue simplemente por motivos de rendimiento y ahorro de memoria, y también por la facilidad de implementación del compilador (especialmente para el tipo de computadoras en el momento en que se inventó C). Pasar matrices enormes "por valor" parece tener un gran impacto en la pila, necesita una operación de copia de matriz completa para cada llamada de función, y probablemente el compilador debe ser más inteligente para generar el código de ensamblaje correcto (aunque el último punto es discutible) . También sería más difícil tratar las matrices asignadas dinámicamente de la misma manera que las matrices asignadas estáticamente (desde el punto de vista de la sintaxis del idioma).

EDITAR: después de leer algunas partes de este enlace , creo que la razón real (y la razón por la que las matrices en las estructuras se tratan como tipos de valor, mientras que las matrices únicas no lo son) es la compatibilidad con versiones anteriores a la predecesora B de C . Aquí está la cita de Dennis Ritchie:

  

[...} La solución constituyó el salto crucial en la cadena evolutiva   entre BCPL sin tipo y C. mecanografiado. Se eliminó la materialización.   del puntero en el almacenamiento, y en su lugar causó la creación de la   puntero cuando el nombre de la matriz se menciona en una expresión. La regla,   que sobrevive en la C de hoy, es que los valores de tipo de matriz son   convertidos, cuando aparecen en expresiones, en punteros a los primeros   de los objetos que componen la matriz.

     

Esta invención permitió que la mayoría del código B existente siguiera funcionando,   A pesar del cambio subyacente en la semántica del lenguaje. [..]

    
respondido por el Doc Brown 20.06.2014 - 19:16
9

Una minicomputadora PDP con solo 8 KB de memoria no puede asignar una pila muy grande. Por lo tanto, en una máquina de este tipo, uno debe tener cuidado en el diseño de un lenguaje (o evolución) para poder minimizar lo que necesita ir en la pila para el uso de llamadas de subrutina común esperado. C todavía se usa hoy en día para programar sistemas integrados con limitaciones de memoria (algunos kB), por lo que la compensación suele ser buena.

En una arquitectura de procesador que tiene muy pocos registros, pasar una matriz mediante un puntero en lugar de un valor con mayor frecuencia permite que un registro se utilice como una optimización de llamadas de subrutina.

    
respondido por el hotpaw2 20.06.2014 - 21:19

Lea otras preguntas en las etiquetas