Программы
Модель памяти Си

Модель памяти Си

Ещё раз вспомним, что в Си всё байты. Но как мы их храним? А как вообще можно?

Динамическая работа с памятью

Конечно, многие алгоритмы можно описать с помощью уже имеющихся в нашем арсенале средств... Но если мы говорим про реальные сервисы, то они редко имеют такое обидное ограничение, как количество элементов, которыми мы можем пользоваться.

До этого мы выделяли жестко фиксированные объёмы памяти. Определяли их прямо на моменте компиляции:

int a;
char b[10];
struct Point2d = { -1, 1 };

– в каждом из перечисленных случаем компилятор знает, сколько нужно выделить памяти под наши переменные. Более того, зная, что область видимости переменной – блок {}, компилятор также знает, когда память можно освободить.

Он может делать это автоматически.

Модель памяти Си

Модель памяти – по сути набор правил: как создавать переменные, где они доступны, сколько под них выделять и когда удалять.

Рассмотрим 3 типа переменных, три подхода к работе с памятью:

Автоматический тип Статический тип Динамический тип
Объявление Объект без связывания и static Имеет связывание или объявлен как static Выделен с помощью *alloc
Время жизни Блок, в котором объявлена переменная Время работы программы От *alloc до free
Инициализация Отсутствует Один раз до запуска программы Частично в случае calloc
Размер Фиксированный, неизменяемый Фиксированный, неизменяемый Любой, изменяемый

Те переменные, которые мы использовали до этого – очевидно, имеют автоматический тип памяти.

Теперь рассмотрим пример статического типа данных. Эти переменные создаются при старте программы и живут до конца работы программы. Это их главное отличие:

#include <stdio.h>

void foo() {
  int a = 10;
  static int sa = 10;

  a += 5;
  sa += 5;

  printf("a = %d, sa = %d\n", a, sa);
}

int main() {
  int i;

  for (i = 0; i < 10; ++i) {
    foo();
  }
}

– можно заметить, что sa инициализирована 1 раз, после чего уже использовалась повторно:

a = 15, sa = 15
a = 15, sa = 20
a = 15, sa = 25
a = 15, sa = 30
a = 15, sa = 35
a = 15, sa = 40
a = 15, sa = 45
a = 15, sa = 50
a = 15, sa = 55
a = 15, sa = 60
Также может быть вам интересно:

Union – Объединения в Си

Опять же довольно уникальная фишка Си – возможность смотреть на одни и те же байты по-разному

Читать »

Динамическое выделение памяти

Итак, динамическое управление памятью – сбрасываем оковы прибитых при компиляции размеров структур!

Читать »
Фото Как настроить отправку почты из Django

Как настроить отправку почты из Django

Письма об ошибках, отчёты на почту, восстановление паролей - всё это полезно при работе с сайтом. Django предоставляет удобный способ это сделать с минимумом настроек!

Фото Добавляем поддержку медиа-файлов в Django проект

Добавляем поддержку медиа-файлов в Django проект

Современные сайты редко ограничиваются только текстом и вёрсткой. Часто в заметках красуются фотографии, а рядом с описанием товаров - их изображения.

Фото Настройка журналирования (логирования) в Python с примерами

Настройка журналирования (логирования) в Python с примерами

Во время работы программы часто нужно сохранять некоторые важные записи о процессе выполнения команды. В Python есть довольно мощный модуль для работы с логами - давайте разберёмся с тем, как его использовать.

Фото Шаблон разработки ПО — Model View Controller (MVC)

Шаблон разработки ПО — Model View Controller (MVC)

MVC - один из самых распространённых архитектурных шаблонов разработки. Часто используется в различных фреймворках. В том числе и в Django.

Фото Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

В Django вы можете передавать данные в шаблоны посредством контекстов. Контекст передаётся из контроллера (view в терминах Django), однако, если одни и те же данные нужны в разных местах, лучше сделать свой контекст-процессор.

Фото Пример своей консольной команды в Django проекте

Пример своей консольной команды в Django проекте

Если вы работали с Django проектом, то, скорее всего, запускали команды из консоли (manage.py). В Django есть простой способ писать свои команды для управления проектом.

Фото Разграничение прав доступа на Django сайте

Разграничение прав доступа на Django сайте

Почти на любом веб-сайте необходимо разделять пользователей на группы и предоставлять им разные возможности. В Django есть довольно серьёзная система прав доступа для пользователей - давайте её рассмотрим!

Фото Пользователи и их создание в Django - своя регистрация на сайте

Пользователи и их создание в Django - своя регистрация на сайте

Если вашим сайтом должны активно пользоваться несколько человек, то полезно их различать, а значит - надо уметь создавать пользователей, либо предоставлять возможность регистрации Django пользователей.