Perché gli array non possono essere passati come argomenti di funzione in C?

12

Dopo questo commento , ho provato a google perché, ma il mio google-fu fallito.

Commento dal link:

[...] But the important thing is that arrays and pointers are different things in C.

Assuming you're not using any compiler extensions, you can't generally pass an array itself to a function, but you can pass a pointer, and index a pointer as if it were an array.

You're effectively complaining that pointers have no length attached. You should be complaining that arrays can't be passed as function arguments, or that arrays degrade to pointers implicitly.

    
posta Florian Margaine 20.06.2014 - 18:53
fonte

2 risposte

18

La mia prima ipotesi per la ragione è stata semplicemente a causa delle prestazioni e dei motivi di risparmio di memoria, e anche per la facilità di implementazione del compilatore (specialmente per il tipo di computer nel momento in cui C è stato inventato). Il passaggio di enormi matrici "in base al valore" sembrava avere un impatto enorme nello stack, ha bisogno di un'operazione di copia array completa per ogni chiamata di funzione e probabilmente il compilatore deve essere più intelligente per generare il codice assembly corretto (anche se l'ultimo punto è discutibile) . Sarebbe anche più difficile trattare gli array allocati dinamicamente allo stesso modo degli array allocati staticamente (dal punto di vista della sintassi del linguaggio).

EDIT: dopo aver letto alcune parti da questo link , penso che la vera ragione (e il motivo per cui gli array nelle strutture sono trattati come tipi di valore, mentre i soli array non lo sono) è la compatibilità con le versioni precedenti del predecessore di C B . Ecco la citazione di Dennis Ritchie:

[...} The solution constituted the crucial jump in the evolutionary chain between typeless BCPL and typed C. It eliminated the materialization of the pointer in storage, and instead caused the creation of the pointer when the array name is mentioned in an expression. The rule, which survives in today's C, is that values of array type are converted, when they appear in expressions, into pointers to the first of the objects making up the array.

This invention enabled most existing B code to continue to work, despite the underlying shift in the language's semantics. [..]

    
risposta data 20.06.2014 - 19:16
fonte
9

Un minicomputer PDP con solo 8 kB di memoria non può allocare uno stack molto grande. Quindi, su una macchina del genere, si deve fare attenzione in un linguaggio design (o evoluzione) per essere in grado di minimizzare ciò che deve andare in pila per l'utilizzo della chiamata di subroutine comune previsto. C è ancora usato oggi per programmare i sistemi embedded con limiti di memoria (pochi kB), quindi il trade-off di solito è buono.

Su un'architettura di processore che ha pochissimi registri, passare qualsiasi array per puntatore anziché per valore più spesso consente di utilizzare un registro come ottimizzazione delle chiamate di subroutine.

    
risposta data 20.06.2014 - 21:19
fonte

Leggi altre domande sui tag