Чому програмістам потрібні покажчики замість фіксованих масивів

1

Ви бажаєте створити текстовий редактор. Можливо це сучасна заміна Vi або свіжий погляд на Notepad. Не має значення. Ціль проста: дозволити користувачам редагувати стандартні ASCII-файли.

Подумайте, як часто програмісти використовують ці інструменти. Це їхній основний інтерфейс з машиною. Це місце, де думки перетворюються на код. Звичайно, ви хочете, щоб він відчувався правильно. Ви хочете, щоб він був швидким. Ви хочете, щоб він обробляв конкретний робочий процес. Тому ви вирішуєте створити свій власний.

Перша перешкода – структура даних. Як зберігати текст у пам’яті? Вам потрібний спосіб швидко маніпулювати символами. Ваша первісна інтуїція? Рядки тексту.

Ви берете масив. Досить просто. Типовий рядок містить 80 символів. Типовий файл має, скажімо, 1000 рядків. Ви оголошуєте двовимірний масив:

`

Це 80 000 символів. Керовано. Чисто.

Але потім на вас руйнується реальність. Ви думаєте про крайні випадки.

Деякі файли є величезними журналами. Тисячі рядків, кожен із яких навряд чи містить 10 символів.

Інші файли – це дампи даних спеціального призначення. Один рядок може містити 542 символи, що представляють пари амінокислот у послідовності ДНК.

А сучасні редактори дають змогу відкривати кілька файлів одночасно. Допустимо, ви обмежуєте це число 10 відкритими файлами. Ви встановлюєте жорстку межу 1000 символів на рядок і 50 000 рядків на файл.

Тепер ваше оголошення виглядає так:

`

Ви робите розрахунки. 50000 разів 1000 разів 10. Це 500 мільйонів символів.

Більшість комп’ютерів не впораються із цим. Навіть із віртуальною пам’яттю це створює навантаження. Запустіть три екземпляри вашого редактора на розрахованій на багато користувачів системі, і ви перевантажите оперативну пам’ять. Це екстравагантне витрачання. Ви виділяєте місце для абсолютного гіршого сценарію, тоді як більшість користувачів просто редагують 100-рядкові файли, що займають 4000 байт.

Проблема з масивами полягає у їх жорсткості. Ви повинні заздалегідь оголосити максимальний розмір у кожному вимірі. Ці розміри перемножуються. І якщо хтось спробує відкрити файл із рядком довжиною 2000 символів? Ви не маєте шансів. Довжина рядка технічно нескінченна. Ви не можете передбачити її.

Саме тому є покажчики.

Як вказівники вирішують проблему неефективного використання пам’яті

Покажчики дозволяють створювати динамічні структури даних. Замість резервування статичного простору заздалегідь, ви виділяєте пам’ять із купи під час виконання програми.

Ви використовуєте стільки пам’яті, скільки потрібно документу. Жодної витрати. Коли ви закриваєте файл, ви повертаєте цю пам’ять до купи. Інші частини програми можуть використовувати її. Пам’ять використовується повторно.

Йдеться не лише про економію місця. Йдеться про гнучкість. Вам не потрібно гадати максимальну довжину рядка. Ви виділяєте те, що потрібно коли це потрібно.

Якщо ви все ще задаєтеся питанням, що таке байт насправді, або як «мега» і «гіга» переводяться в реальні обмеження, прочитайте про біти та байти. Потім повертайтеся. Вам потрібно зрозуміти апаратні обмеження, щоб оцінити, чому статичні масиви тут не працюють.