U wilt een teksteditor bouwen. Misschien is het een moderne vervanging voor Vi of een frisse kijk op Kladblok. Het maakt niet uit. Het doel is simpel: laat gebruikers standaard ASCII-bestanden bewerken.
Bedenk eens hoe vaak programmeurs deze tools daadwerkelijk gebruiken. Het is hun primaire interface met de machine. Het is waar gedachten code worden. Je wilt natuurlijk dat het goed voelt. Je wilt dat het snel gaat. U wilt dat het uw specifieke workflow afhandelt. Dus je besluit er zelf een te bouwen.
De eerste hindernis is de datastructuur. Hoe sla je de tekst op in het geheugen? Je hebt een manier nodig om de personages snel te manipuleren. Je aanvankelijke instinct? Regels tekst.
Je pakt een array. Eenvoudig genoeg. Een typische regel is 80 tekens. Een typisch bestand heeft misschien 1.000 regels. Je declareert een tweedimensionale array:
Dat zijn 80.000 tekens. Beheersbaar. Schoon.
Maar dan slaat de werkelijkheid toe. Je denkt aan randgevallen.
Sommige bestanden zijn enorme loglijsten. Duizenden regels, elk amper 10 tekens lang.
Andere bestanden zijn gegevensdumps voor speciale doeleinden. Eén regel kan 542 tekens bevatten die aminozuurparen in een DNA-sequentie vertegenwoordigen.
En met moderne editors kunt u meerdere bestanden tegelijk openen. Laten we zeggen dat u het beperkt tot 10 geopende bestanden. U stelt een harde limiet in van 1.000 tekens per regel en 50.000 regels per bestand.
Uw aangifte ziet er nu als volgt uit:
Jij kraakt de cijfers. 50.000 keer 1000 keer 10. Dat zijn 500 miljoen tekens.
De meeste computers kunnen dat niet aan. Zelfs met virtueel geheugen is het lastig. Voer drie exemplaren van uw editor uit op een systeem met meerdere gebruikers en u verstikt het RAM-geheugen. Het is een extravagante verspilling. U wijst ruimte toe voor het allerslechtste scenario, waarbij de meeste gebruikers alleen maar bestanden van 100 regels bewerken die 4.000 bytes in beslag nemen.
Het probleem met arrays is hardnekkig. U dient vooraf de maximale maat per maat door te geven. Die dimensies vermenigvuldigen zich. En als iemand een bestand probeert te openen met een regel van 2000 tekens? Je hebt pech. De lijnlengte is technisch oneindig. Je kunt het niet voorspellen.
Dit is de reden waarom er aanwijzingen zijn.
Hoe pointers geheugenverspilling oplossen
Met pointers kunt u dynamische datastructuren bouwen. In plaats van vooraf statische ruimte te reserveren, wijst u geheugen toe vanaf de heap terwijl het programma wordt uitgevoerd.
U gebruikt precies de hoeveelheid geheugen die het document nodig heeft. Geen verspilling. Wanneer u een bestand sluit, plaatst u dat geheugen terug op de heap. Andere delen van het programma kunnen er gebruik van maken. Het geheugen wordt gerecycled.
Het gaat niet alleen om het besparen van ruimte. Het gaat om flexibiliteit. U hoeft de maximale lijnlengte niet te raden. U wijst toe wat u nodig heeft, wanneer u het nodig heeft.
Als je je nog steeds afvraagt wat een byte eigenlijk is, of hoe ‘mega’ en ‘giga’ zich vertalen naar beperkingen in de echte wereld, lees dan meer over bits en bytes. Kom dan terug. U moet de hardwarelimieten begrijpen om te begrijpen waarom statische arrays hier falen.



























