Статические и динамические объекты программ: компиляция против выполнения

Модуль "Объекты и ссылки" • урок 1 из 7 • ~6 минут

Суть урока. Объекты программы делятся на два вида. У статических тип, размер и само существование известны еще на этапе компиляции и не меняются. Динамические создаются, меняются и уничтожаются во время выполнения - в специальной области памяти, куче. Статика дает скорость и надежность, динамика - гибкость.
Статические и динамические объекты программ: статический и динамический массив
Сравнение статического и динамического распределения памяти

Что это такое

Статические объекты - те, чьи свойства (тип, размер памяти, связи) определяются по тексту программы еще при компиляции и остаются неизменными до самого конца работы. Компилятор смотрит на int x[10]; и уже знает про этот массив все: десять целых чисел, ни больше ни меньше.

Динамические объекты - те, чьи свойства или само существование определяются в процессе выполнения (runtime). Сколько элементов будет в массиве, выяснится, когда пользователь введет число; объект появится, когда программа попросит под него память, и исчезнет, когда память освободят.

Зачем это нужно

У каждого подхода свои сильные стороны:

Как физически организованы статические и динамические объекты программ

А как в Python? В Python преобладает неограниченный динамизм: в один список можно сложить элементы разных типов, а переменная спокойно меняет тип на лету. В C наоборот, преобладает статика: объявили int x[10]; - получили ровно десять int на все время жизни функции. Чтобы получить динамический объект в C, память у системы запрашивают вручную.

Оба вида объектов в одной программе на C

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    /* Статический объект: размер и тип зафиксированы при компиляции */
    int staticArray[5] = {1, 2, 3, 4, 5};

    int n = 10; /* размер выясняется в рантайме, например вводится пользователем */

    /* Динамический объект: память выделяется во время выполнения, из кучи */
    int* dynamicArray = (int*)malloc(n * sizeof(int));

    if (dynamicArray != NULL) {
        dynamicArray[0] = 42;
        /* Динамический объект нужно уничтожить вручную */
        free(dynamicArray);
    }

    return 0;
}

Обратите внимание: у динамического массива нет собственного имени - есть только указатель dynamicArray, через который к нему можно добраться. Что такое указатель, разберем в следующем уроке.

Коротко: главное

  • Статический объект: тип, размер и существование известны с этапа компиляции.
  • Динамический объект: создается, меняется и уничтожается во время выполнения, живет в куче.
  • Статика дает скорость и надежность (проверка типов, память заранее), динамика - гибкость.
  • Языки различаются уровнем изменчивости: строгие C и Pascal против динамичных Python и Lisp.
  • В C динамические объекты создает malloc, уничтожает free; имени у них нет - только указатель.

Проверьте себя

Программа читает у пользователя число n и вызывает malloc(n * sizeof(int)). Каким получился массив?

Как вам урок? Спасибо за отзыв!