Практика языка C (МФТИ, 2023-2024). Углубление пройденного: логическая память и виртуальная память.

preview_player
Показать описание
Практические занятия по языку C на первом курсе МФТИ. Кафедра информатики.

Семинарист: Константин Владимиров.
Дата: 13 октября 2023 года.
Съёмка: Марк Гончаров.
Звук: Юлий Тарасов.

Timeline
00:00 Intro
02:26 Genesis
09:35 Пространственные соотношения
22:30 Указатели на указатели
28:42 Массивы
33:30 Виртуальная память
37:28 Структура адресного пространства
45:10 Время решать задачи
48:47 Время жизни и область видимости
51:20 Куча и утечки памяти
58:40 Исчерпание кучи и исчерпание стека
01:06:47 Статические переменные
01:11:30 Бенчмаркинг
01:21:10 Литература и завершение

Errata:
* пока пусто
Рекомендации по теме
Комментарии
Автор

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

НатальяСапог
Автор

11:07 в ядрах ARM есть механизм bit banding для линейной адресации по битам. В основном это сделано для быстрого управления регистрами переферии.

DARTWADER
Автор

я пришел немного подушнить и сказать, что 90210 это почтовый индекс в беверли хилсс) Отличня лекция! Смотрю с удовольствием и интересом!

evgeniykochetkov
Автор

49:34 Почему получили SIGSEGV, а не печать мусорного значения? Адрес "res" располагался на стеке, который заранее выделен для этого процесса и размер этого стека фиксирован. Т.е. вроде бы обращаемся к памяти, которая выделена под наше приложение и существует пока программа запущена.

alexandrsmirnov
Автор

26:10 можно смотреть на указатели и числа как на точки и вектора в одномерном пространстве. Мы можем сложить два вектора (два числа)? - да, получим вектор (число). Можем сложить две точки (адреса) - нет. Можем вычесть две точки (адреса) друг из друга - да, получим вектор (число).
Чтобы лучше это представить, можно представлять точки и вектора одномерного пространства как элекменты двухмерного пространства (x, y), где x - координата точки или вектора, а y может принимать только значения 0 или 1. Где 0 означает что элемент является вектором, а 1 - точкой. Вылетело из головы как такое представление называется.

ivankorotkov
Автор

Если бы я учился в этом ВУЗе я б не вылазил бы с лекций Константина

Олег-лбг
Автор

"Дополнительный код" для 4 бит вроде кодирует число в диапазоне от -8 до 7, где - 8 это четыре еденички (1111), а 7 это 0111

ГомункулСтарший
Автор

Грамотный преподаватель и отличные лекции. В своё время мне тоже с преподавателем повезло.
Возник вопрос, как бороться с фрагментацией кучи, если это вообще возможно? И есть ли какой-то способ принудительно освободить всю кучу сразу?

ПЛИСоводство
Автор

Неинициализированный глобальный массив попадёт в .bss и как следствие на размер бинарника не повлияет, а занулен будет (весь bss) чем то вроде memset. В секцию .data попадут только глобальные переменные с начальными значениями и они уже будут помещены в бинарник (иначе откуда эти начальные значения брать)

sergeykirdyankin
Автор

Здравствуйте, Константин
1:07:54 (static int i = 0;)
про глобальную переменную с ограниченной областью видимости понятно. а что с инициализацией? почему = 0 каждый раз не отрабатывает при вызове функции? или инициализация компилятором куда-то выносится? а что если там вызов функции? static int i = getValue();

РусланКутынко
Автор

8:09 но ведь в базе си - это безтиповый язык. у него есть только вычисления и данные. Там "типы" - это data scheme. Иначе говоря "всё есть инт"

CurryCurry-bs
Автор

Добрый день, замечательная лекция! У меня вопрос, хотел именно для себя прояснить: а на 16 слайде у вас нет "неточности" на картинке? Просто там показано, что процесс 1 ссылается на адрес на диске, но если я все правильно понимаю, он должен ссылаться на оперативную память, а та, в свою очередь, на жесткий диск (сначала ищем значение в кэше, потом в оперативке, потом уже на диске)? Поправьте, пожалуйста, если я неправильно понимаю.

niceday
Автор

Нда случайно зашел посмотреть
Засиделся всю ночь слушал XD

Жалко даже что мне ничего такого 15 лет назад не рассказывали когда учился в МАТИ. Да и вообще лекции по программированию были не очень.

YarGolubev
Автор

20:45 Почему pb не будет ячейкой в которой будет лежать значение, если там будет адрес на нулевой элемент массива? Никак не могу понять или понимаю Ваши слова не верно.

vadmse
Автор

12:25 Про амер. систему нумерации домов не нашёл информации. Чаще встречается схема, по которой 90 - номер квартала, 210 - номер дома в квартале или всё вместе - почтовый индекс.

vadmse
Автор

25:45 Значит в С нет позитивных указателей(

ddvamp
Автор

И переменная и ее адрес и адрес ее адреса (при условии, что все сохранили) - это все какие-то биты в памяти. Правильно ли, что "указатель" это, своего рода, договоренность (контракт), в языке между компилятором и программистом? Когда программист заводит переменную типа указатель, то компилятор при работе с этой переменной, использует правила этого контракта.

ddcd
Автор

28:31 а вас я попрошу остаться)) Можете вкратце пояснить за с++.

DARTWADER
Автор

Уважаемый Константин, а почему в место глобальных переменных не использовать enum{} ?

tohoto
Автор

Константин, верно ли я понимаю, что (px - py) будет UB? Если int x, y; int *px = &x; int *py = &y;

vadmse