Jakie było uzasadnienie braku wyraźnego przechowywania długości tablicy z tablicą w C
?
Moim zdaniem istnieje wiele powodów, aby to zrobić, ale niewiele z tego powodu (C89). Na przykład:
- Dostępna długość bufora może zapobiec jego przepełnieniu.
- Styl Java
arr.length
jest zarówno przejrzysty, jak i pozwala programistom uniknąć konieczności utrzymywania wieluint
s na stosie, jeśli ma się do czynienia z kilkoma tablicami - Parametry funkcji stają się bardziej przekonujące.
Moim zdaniem jednak najbardziej motywującym powodem jest to, że zwykle nie oszczędza się miejsca bez zachowania długości. Zaryzykowałbym stwierdzenie, że większość zastosowań tablic wymaga dynamicznej alokacji. To prawda, że mogą być przypadki, w których ludzie używają tablicy przydzielonej na stosie, ale to tylko jedno wywołanie funkcji * - stos może obsłużyć dodatkowe 4 lub 8 bajtów.
Ponieważ menedżer sterty i tak musi śledzić rozmiar wolnego bloku zużywanego przez dynamicznie przydzielaną tablicę, dlaczego nie uczynić tej informacji użyteczną (i dodać dodatkową regułę, sprawdzaną podczas kompilacji, że nie można jawnie manipulować długością, chyba że lubię strzelać sobie w stopę).
Jedyną rzeczą, o której mogę myśleć po drugiej stronie, jest to, że żadne śledzenie długości nie mogło uprościć kompilatorów, ale nie było o wiele prostsze.
* Technicznie można napisać jakąś funkcję rekurencyjną z tablicą z automatycznym przechowywaniem, aw tym (bardzo skomplikowanym) przypadku przechowywania długości może faktycznie skutkować efektywnie większym wykorzystaniem miejsca.
malloc()
obszaru edycji w przenośny sposób?” To sprawia, że zastanawiam się kilka razy.