Почему программистам нужны указатели вместо фиксированных массивов

3

Вы хотите создать текстовый редактор. Возможно, это современная замена Vi или свежий взгляд на Notepad. Неважно. Цель проста: позволить пользователям редактировать стандартные ASCII-файлы.

Подумайте, как часто программисты на самом деле используют эти инструменты. Это их основной интерфейс с машиной. Это место, где мысли превращаются в код. Естественно, вы хотите, чтобы он ощущался правильно. Вы хотите, чтобы он был быстрым. Вы хотите, чтобы он обрабатывал ваш конкретный рабочий процесс. Поэтому вы решаете создать свой собственный.

Первое препятствие — структура данных. Как хранить текст в памяти? Вам нужен способ быстро манипулировать символами. Ваша первоначальная интуиция? Строки текста.

Вы берете массив. Достаточно просто. Типичная строка содержит 80 символов. Типичный файл имеет, скажем, 1000 строк. Вы объявляете двумерный массив:

Это 80 000 символов. Управляемо. Чисто.

Но затем на вас обрушивается реальность. Вы думаете о крайних случаях.

Некоторые файлы представляют собой огромные журналы. Тысячи строк, каждая из которых едва ли содержит 10 символов.

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

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

Теперь ваше объявление выглядит так:

Вы производите расчеты. 50 000 раз 1000 раз 10. Это 500 миллионов символов.

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

Проблема с массивами заключается в их жесткости. Вы должны заранее объявить максимальный размер в каждом измерении. Эти размеры перемножаются. И если кто-то попытается открыть файл со строкой длиной 2000 символов? У вас нет шансов. Длина строки технически бесконечна. Вы не можете предсказать ее.

Именно поэтому существуют указатели.

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

Указатели позволяют создавать динамические структуры данных. Вместо резервирования статического пространства заранее, вы выделяете память из кучи во время выполнения программы.

Вы используете ровно столько памяти, сколько нужно документу. Никакой траты. Когда вы закрываете файл, вы возвращаете эту память в кучу. Другие части программы могут ее использовать. Память повторно используется.

Речь идет не только об экономии места. Речь идет о гибкости. Вам не нужно гадать максимальную длину строки. Вы выделяете то, что нужно, когда это нужно.

Если вы все еще задаетесь вопросом, что такое байт на самом деле, или как «мега» и «гига» переводятся в реальные ограничения, прочтите о битах и байтах. Затем возвращайтесь. Вам нужно понять аппаратные ограничения, чтобы оценить, почему статические массивы здесь не работают.