Dlaczego programiści potrzebują wskaźników zamiast stałych tablic

17

Chcesz utworzyć edytor tekstu. Być może jest to nowoczesny zamiennik Vi lub świeże podejście do Notatnika. Nie ma znaczenia. Cel jest prosty: pozwolić użytkownikom edytować standardowe pliki ASCII.

Zastanów się, jak często programiści faktycznie korzystają z tych narzędzi. To jest ich główny interfejs z maszyną. To miejsce, w którym myśli zamieniają się w kod. To naturalne, że chcesz, żeby było dobrze. Chcesz, żeby było szybko. Chcesz, aby obsługiwał Twój konkretny przepływ pracy. Decydujesz się więc stworzyć własny.

Pierwszą przeszkodą jest struktura danych. Jak przechowywać tekst w pamięci? Potrzebujesz sposobu na szybkie manipulowanie symbolami. Jaka jest Twoja początkowa intuicja? Linie tekstu.

Bierzesz tablicę. Dość proste. Typowa linia zawiera 80 znaków. Typowy plik ma, powiedzmy, 1000 linii. Deklarujesz tablicę dwuwymiarową:

To jest 80 000 znaków. Do opanowania. Czysto.

Ale wtedy uderza cię rzeczywistość. Myślisz o przypadkach Edge.

Niektóre pliki to ogromne dzienniki. Tysiące linii, każda o długości zaledwie 10 znaków.

Inne pliki to zrzuty danych specjalnego przeznaczenia. Jedna linia może zawierać 542 znaki reprezentujące pary aminokwasów w sekwencji DNA.

Nowoczesne edytory umożliwiają otwieranie kilku plików jednocześnie. Załóżmy, że ograniczasz tę liczbę do 10 otwartych plików. Ustawiasz sztywny limit 1000 znaków w linii i 50 000 linii w pliku.

Twoja reklama wygląda teraz tak:

Robisz obliczenia. 50 000 razy 1000 razy 10. To 500 milionów znaków.

Większość komputerów sobie z tym nie radzi. Nawet w przypadku pamięci wirtualnej powoduje to obciążenie. Uruchom trzy instancje edytora w systemie z wieloma użytkownikami, a przeciążysz pamięć RAM. To ekstrawaganckie marnotrawstwo. Alokujesz miejsce na absolutnie najgorszy scenariusz, kiedy większość użytkowników edytuje tylko 100-liniowe pliki zajmujące 4000 bajtów.

Problem z tablicami polega na ich sztywności. Należy wcześniej zadeklarować maksymalny rozmiar w każdym wymiarze. Te rozmiary są mnożone. A co jeśli ktoś spróbuje otworzyć plik zawierający ciąg 2000 znaków? Nie masz szans. Długość sznurka jest technicznie nieskończona. Nie możesz tego przewidzieć.

Dlatego istnieją wskaźniki.

Jak wskaźniki rozwiązują problem nieefektywnego wykorzystania pamięci

Wskaźniki umożliwiają tworzenie dynamicznych struktur danych. Zamiast rezerwować z wyprzedzeniem przestrzeń statyczną, przydzielasz pamięć ze sterty podczas działania programu.

Używasz dokładnie tyle pamięci, ile potrzebuje dokument. Żadnych odpadów. Kiedy zamykasz plik, zwracasz tę pamięć na stertę. Inne części programu mogą z niego korzystać. Pamięć jest ponownie wykorzystywana.

Nie chodzi tylko o oszczędność miejsca. Chodzi o elastyczność. Nie musisz zgadywać maksymalnej długości linii. Uwalniasz to, czego potrzebujesz, kiedy tego potrzebujesz.

Jeśli nadal zastanawiasz się, czym właściwie jest bajt lub jak „mega” i „giga” przekładają się na rzeczywiste limity, poczytaj o bitach i bajtach. Potem wróć. Musisz zrozumieć ograniczenia sprzętowe, aby docenić, dlaczego tablice statyczne tutaj nie działają.