October 17

Статические и динамические массивы в C++.

Прежде чем начать давайте обговорим что такое статический и динамический формат вообще.

Статическая и динамическая память — это два основных способа управления оперативной памятью компьютера, которые существенно отличаются по принципу работы, назначению и способу использования.

Статическая память (Stack)

Статическая память выделяется для переменных на этапе компиляции программы. Все переменные, объявленные в функции или блоке кода (например, локальные переменные или статические массивы), используют эту область памяти. Она имеет фиксированный размер, и выделение памяти происходит автоматически, когда программа входит в область видимости переменной. Когда выполнение программы покидает область видимости (например, при выходе из функции), память, отведённая для переменной, освобождается.

Особенности статической памяти:

  1. Фиксированный размер: Размер переменной или массива в статической памяти задается на этапе компиляции и не может изменяться во время выполнения программы. Например, если массив из 10 элементов был выделен на этапе компиляции, его размер остается неизменным до конца программы.
  2. Быстрое выделение и освобождение: Память выделяется и освобождается автоматически, что делает операции с ней очень быстрыми. Для управления памятью в стеке не требуется вмешательства программиста, она освобождается сразу после выхода из области видимости переменной.
  3. Ограничение по объему: Объем стека (stack) обычно ограничен и зависит от операционной системы и настроек программы. Из-за этого хранение больших объемов данных (например, очень больших массивов) в стеке может привести к ошибке переполнения стека (stack overflow).
  4. Отсутствие контроля программиста: Программист не контролирует процессы выделения и освобождения памяти в стеке — они управляются автоматически компилятором.

Пример использования статической памяти в C++:

void func() { 
    int x = 10; 
// x хранится в статической памяти (в стеке) 
}
// или проще
int b = 20;

Динамическая память (Heap)

Динамическая память выделяется в куче (heap) во время выполнения программы с помощью специальных операторов, таких как new в C++ или malloc в C. Это позволяет программе работать с переменными и массивами переменного размера, которые могут изменяться в процессе выполнения.

Особенности динамической памяти:

  1. Гибкость в размере: Динамическая память позволяет выделять память на этапе выполнения программы. Например, вы можете создать массив любого размера на основе данных, полученных от пользователя, или других факторов.
  2. Неограниченный объем (в пределах доступной оперативной памяти): Куча обычно значительно больше стека, что позволяет выделять большие объёмы памяти. Однако работа с ней требует осторожности, чтобы избежать ошибок.
  3. Явное управление: Выделение и освобождение динамической памяти осуществляется вручную. Программист обязан сам освобождать память, когда она больше не нужна, с помощью оператора delete в C++ или функции free в C. Несоблюдение этого правила приводит к утечкам памяти (memory leaks), когда выделенная память не освобождается, что может привести к исчерпанию доступных ресурсов системы.
  4. Относительная медлительность: Выделение памяти в куче занимает больше времени, чем в стеке, так как куча — это большая область памяти, которая управляется операционной системой. Операции с динамической памятью могут быть менее эффективны.

Пример использования динамической памяти в C++:

int* ptr = new int[10];  // Выделение памяти под массив из 10 элементов в куче
delete[] ptr;            // Освобождение памяти