Qual era il ragionamento dietro non memorizzare esplicitamente la lunghezza di una matrice con una matrice in C
?
Per come la vedo io, ci sono motivi schiaccianti per farlo ma non molti a supporto dello standard (C89). Ad esempio:
- La lunghezza disponibile in un buffer può impedire il sovraccarico del buffer.
- Un
arr.length
in stile Java è chiaro ed evita al programmatore di dover conservare moltiint
s nello stack se si ha a che fare con diversi array - I parametri della funzione diventano più convincenti.
Ma forse la ragione più motivante, secondo me, è che di solito, nessuno spazio viene salvato senza mantenere la lunghezza. Mi azzarderei a dire che la maggior parte degli usi degli array comporta allocazione dinamica. È vero, ci possono essere casi in cui le persone usano un array allocato nello stack, ma questa è solo una chiamata di funzione * - lo stack può gestire 4 o 8 byte extra.
Poiché il gestore dell'heap deve tracciare comunque la dimensione del blocco libero utilizzata dall'array assegnato dinamicamente, perché non rendere utilizzabili tali informazioni (e aggiungere la regola aggiuntiva, verificata in fase di compilazione, non è possibile manipolarne esplicitamente la lunghezza a meno che non ci si voglia sparare ai piedi).
L'unica cosa che posso pensare dall'altra parte è che nessun tracciamento della lunghezza può aver reso i compilatori più semplici, ma non quello molto più semplice.
* Tecnicamente, si potrebbe scrivere una sorta di funzione ricorsiva con una matrice con memorizzazione automatica, e in questo caso (molto elaborato) la memorizzazione della lunghezza potrebbe effettivamente comportare un uso più efficiente dello spazio.