Статические и динамические массивы в C++.
Прежде чем начать давайте обговорим что такое статический и динамический формат вообще.
Статическая и динамическая память — это два основных способа управления оперативной памятью компьютера, которые существенно отличаются по принципу работы, назначению и способу использования.
Статическая память (Stack)
Статическая память выделяется для переменных на этапе компиляции программы. Все переменные, объявленные в функции или блоке кода (например, локальные переменные или статические массивы), используют эту область памяти. Она имеет фиксированный размер, и выделение памяти происходит автоматически, когда программа входит в область видимости переменной. Когда выполнение программы покидает область видимости (например, при выходе из функции), память, отведённая для переменной, освобождается.
Особенности статической памяти:
- Фиксированный размер: Размер переменной или массива в статической памяти задается на этапе компиляции и не может изменяться во время выполнения программы. Например, если массив из 10 элементов был выделен на этапе компиляции, его размер остается неизменным до конца программы.
- Быстрое выделение и освобождение: Память выделяется и освобождается автоматически, что делает операции с ней очень быстрыми. Для управления памятью в стеке не требуется вмешательства программиста, она освобождается сразу после выхода из области видимости переменной.
- Ограничение по объему: Объем стека (stack) обычно ограничен и зависит от операционной системы и настроек программы. Из-за этого хранение больших объемов данных (например, очень больших массивов) в стеке может привести к ошибке переполнения стека (stack overflow).
- Отсутствие контроля программиста: Программист не контролирует процессы выделения и освобождения памяти в стеке — они управляются автоматически компилятором.
Пример использования статической памяти в C++:
void func() { int x = 10; // x хранится в статической памяти (в стеке) } // или проще int b = 20;
Динамическая память (Heap)
Динамическая память выделяется в куче (heap) во время выполнения программы с помощью специальных операторов, таких как new
в C++ или malloc
в C. Это позволяет программе работать с переменными и массивами переменного размера, которые могут изменяться в процессе выполнения.
Особенности динамической памяти:
- Гибкость в размере: Динамическая память позволяет выделять память на этапе выполнения программы. Например, вы можете создать массив любого размера на основе данных, полученных от пользователя, или других факторов.
- Неограниченный объем (в пределах доступной оперативной памяти): Куча обычно значительно больше стека, что позволяет выделять большие объёмы памяти. Однако работа с ней требует осторожности, чтобы избежать ошибок.
- Явное управление: Выделение и освобождение динамической памяти осуществляется вручную. Программист обязан сам освобождать память, когда она больше не нужна, с помощью оператора
delete
в C++ или функцииfree
в C. Несоблюдение этого правила приводит к утечкам памяти (memory leaks), когда выделенная память не освобождается, что может привести к исчерпанию доступных ресурсов системы. - Относительная медлительность: Выделение памяти в куче занимает больше времени, чем в стеке, так как куча — это большая область памяти, которая управляется операционной системой. Операции с динамической памятью могут быть менее эффективны.
Пример использования динамической памяти в C++:
int* ptr = new int[10]; // Выделение памяти под массив из 10 элементов в куче delete[] ptr; // Освобождение памяти