Was war der Grund dafür, dass die Länge eines Arrays nicht explizit mit einem Array in gespeichert wurde C
?
So wie ich das sehe, gibt es überwältigende Gründe dafür, aber nicht sehr viele, die den Standard (C89) unterstützen. Zum Beispiel:
- Wenn Länge in einem Puffer verfügbar ist, kann ein Pufferüberlauf verhindert werden.
- Ein Java-Stil
arr.length
ist klar und vermeidet, dass der Programmierer vieleint
s auf dem Stapel halten muss, wenn er mit mehreren Arrays arbeitet - Funktionsparameter werden zwingender.
Aber der vielleicht motivierendste Grund ist meiner Meinung nach, dass normalerweise kein Platz gespart wird, ohne die Länge beizubehalten. Ich würde sagen, dass die meisten Verwendungen von Arrays eine dynamische Zuordnung beinhalten. Zwar kann es vorkommen, dass Benutzer ein Array verwenden, das auf dem Stack zugewiesen ist, dies ist jedoch nur ein Funktionsaufruf * - der Stack kann 4 oder 8 Byte mehr verarbeiten.
Da der Heap-Manager ohnehin die von dem dynamisch zugewiesenen Array verbrauchte freie Blockgröße nachverfolgen muss, sollten Sie diese Informationen nutzbar machen (und die zusätzliche Regel hinzufügen, die beim Kompilieren überprüft wurde, dass die Länge nur dann explizit geändert werden kann, wenn dies der Fall ist schießen sich gern in den Fuß).
Das Einzige, woran ich auf der anderen Seite denken kann, ist, dass keine Längenverfolgung Compiler einfacher gemacht hat, aber nicht so viel einfacher.
* Technisch könnte man mit einem Array mit automatischem Speicher eine Art rekursive Funktion schreiben, und in diesem (sehr aufwändigen) Fall kann das Speichern der Länge tatsächlich zu einer effektiveren Nutzung des Speicherplatzes führen.
malloc()
ed-Bereichs nicht auf tragbare Weise abgefragt werden?" Das ist eine Sache, die mich mehrmals wundern lässt.