Офигенная дикция и подача материала! Прошу вас рассмотреть создание гайдов по опитимизации чего-либо на С для других языков. Мне кажется, это зайдет зрителям.
Это шедевр!!! Всё просто, понятно, без лишней воды! Не останавливайся. Было бы неплохо информацию дублировать в текстовом формате в блоге, возможно кому-то воспринимать информацию по видео сложнее, чем в печатном виде.
Заставляешь своим видео сесть за комп и по изучать (вспомнить) поведение программы на низком уровне. Показ программы на Си, ее дизассемблирование и синхронный анализ - ценный контент. Благодарю за видео.
Пожалуй, лучший материал по Си на русском ютубе! А можешь пожалуйста объяснить зачем в .c файле код в #ifndef? Я учусь в школе программирования, и в первый раз вижу такой стиль. Может направишь на сторонний материал, чтобы это понять. Про стековый кадр и регистры bp sp тоже конечно интересно))
То есть я знаю, что это деректива препроцессора, которая означает что, если define *.c не определен, то его нужно определить, но все равно не понимаю зачем это в Си файле. До этого видел такую конструкцию только в хедерах. И еще вопрос, где все же лучше подключать библиотеки? В Си файлах или в хедерах? У меня на учебе поголовно все делают это в хедере. Это просто кто как предпочитает? Или же есть какой-то моветон?
#ifndef в си файле возможно и не требуется. Общий смысл такой конструкции - избегание повторного включения заголовочного файла и, соответственно, повторного определения структур, типов данных и т.д.. Подобный стиль оформления я встретил в книге по Borland C++. Если под подключением библиотеки имеется в виду конструкция #include, то всё зависит от ситуации. Если рассмотреть подключение какой-нибудь сторонней библиотеки, то в её хедере есть только те директивы #include, которые требуются для определения необходимых ей типов данных. Хотя сама библиотека может использовать другие модули, подключая их заголовочные файлы в своей реализации (внутри .c). Хедер (заголовочный файл) - это ещё и "интерфейс" для тех, кто захочет воспользоваться библиотекой (или модулем). На мой взгляд, нет необходимости указывать определения тех конструкций, которые используются только "под капотом".
Я в восторге от простоты объяснения! Я узнал о семантике и синтаксисе Си больше, чем за 300 страниц книги по Си. Как я понимаю, стек в сути - это односторонний связный список? И второй вопрос: размер передаваемой для выделения памяти должно как-то коррелировать с размером машинного слова для ускорения работы стека?
Стек не обязательно является списком. Односторонний связанный список - это один из вариантов реализации. Стеком вполне может быть массив. Суть в порядке чтения/удаления и записи/добавления элементов. В данном видео стек-список - это абстрактная структура, сильно отличающаяся от того же стека программы (что в примере с объектным кодом). Цель сравнения в выделении существенных признаков стека как такового. Относительно второго вопроса можно вспомнить, что в структурах (struct) по умолчанию установлено выравнивание в 4 байта для элементов , что помогает оптимизировать работу компилятора. Будет ли лучше работать оптимизация, если применить подобный метод для памяти - трудно сказать.
Сделай, пожалуйста, продолжение про стековый кадр и регистры. И ещё момент: пробую переписывать твои уроки сразу в открытое окно редактора при запущенном видео (думаю, так многие тут делают). Немного не удобно, что текст на видео располежен строго по середине, и окно редактора приходится вжимать в правую область экрана, сильно ограничивая обзор. Не мог бы ты в последующих уроках немного сместить текст влево (немного сократив ширину фпейма с директорией проекта, например)? Но всё равно спасибо за уроки, они очень помогают!
7:00 ну вообще-то это виртуальный стек, а не настоящий. То есть на самом деле реализация является связным списком. А чтобы сделать стек, надо сразу выделить память на весь стек, и уже в нём копаться как массиве структур с обратным индексом, и с указателями.
@@tripledistillation1755 ну да, но хочется глобально что-то, ведь у нас массив это указатель, в стеках указатели, можно функции делать на указатели, почему мы, если в функцию хотим передать массив, то передаем именно указатель, почему если мы имеем int* a и int* b то если сделать b = a, а потом менять b то и а поменяется, ну вот что-то такое, потому что, как я понял, указатели это вообще очень основополагающая тема, а каких-то толковых разборов нет(
sn, sn->name и sn->data - это указатели на три разных области памяти. Все три области выделены динамически и ни одна из них не является частью другой. Следовательно, free для sn не повлечет за собой освобождение двух других областей. Представьте, что у вас есть огромная кладовка, в которой имеется банка с огурцами и, где-то ещё, банка с помидорами. В руках вы держете записную книжку, в которой указаны места расположения банок. Если сразу выбросить книжку, банки никуда не денутся, но найти их будет сложновато. А вот если по записям найти продукты и достать их из кладовки, то книжка вам больше не нужна, так как описывает то, чего нет. Тут sn - указатель на книжку, sn->name - на огурцы, sn->data - на помидоры) Обойтись одной процедурой free(sn) можно тогда, когда значения указателей sn->name и sn->data получены напрямую от пользователя и он берет ответственность за их природу. Код модуля уменьшится, но в этом случае стек будет лишь вносить порядок в существующий набор данных, а пользователю придется тратить время на "обвязку" и просчет возможных ошибок. В Java, например, можно присвоить переменной значение nil, а "сборщик мусора" сам удалит из памяти то, на что нет ни одной ссылки в коде. В C никто не будет следить за утечками памяти, кроме самого программиста. Это, на мой взгляд, очень важный "воспитующий" фактор, заставляющий вникать в суть вещей. Спасибо за вопрос
Что подразумевается под стеком технологий для построения приложений профессионального уровня? Какие существуют критерии для приложений, чтобы зафиксировать этот профессиональный уровень? Общепринятый в каком масштабе? Я не профессионал, поэтому было бы интересно узнать
для профессионального уровня в интернете почти ничего нет! даже стандартные библиотеки все в говне! все хорошие библиотечки не выходят за рамки коммерческих фирм.
@@nRADRUS Хороши ли библиотеки в рамках коммерческих фирм - вопрос спорный. Со стороны обыкновенного пользователя "профессиональное приложение" - это очередной новый мессенджер со старым функционалом, но зато кладущий на лопатки более мощный процессор.
Странно, я вроде оставлял ответ, даже с ссылками на материалы Под стеком технологий я имел в виду набор технологий, используемые при разработке приложении. Для веб приложений со стороны бэка это обычно веб фреймворк + орм/query builder. Если смотреть в контексте всего приложения и его работы, то я бы сказал ось + веб сервер + бд (часто можно слышать про LAMP). Не знаю, если честно, какие есть для сишки варианты, для шарпа могу назвать ASP NET + EFCore/NHibernate/Raw queries. Есть еще такая вещь, как DI, в шарпе и Java в основном видел, в плюсах hydra есть, но я услышал о ней лишь 1 раз
Какая же услада для ушей слушать такое приятное и понятное объяснение)
Офигенная дикция и подача материала!
Прошу вас рассмотреть создание гайдов по опитимизации чего-либо на С для других языков. Мне кажется, это зайдет зрителям.
Это шедевр!!! Всё просто, понятно, без лишней воды! Не останавливайся. Было бы неплохо информацию дублировать в текстовом формате в блоге, возможно кому-то воспринимать информацию по видео сложнее, чем в печатном виде.
Боги услышали мои мольбы!!! Русскоязычный сегмент пополнился первоклассным контентом! Всё отлично!Даже прицепиться не к чему!👍👍👍👍👍
Заставляешь своим видео сесть за комп и по изучать (вспомнить) поведение программы на низком уровне. Показ программы на Си, ее дизассемблирование и синхронный анализ - ценный контент. Благодарю за видео.
извиняюсь у автора канала но только вот сегодня смотрел ролик
watch?v=6dfsZ5q_tXg
Есть противоречие?
Это очень классное и качественное видео, буду с удовольствием ждать новые видео👍
Интересно и доступно объясняешь
Спасибо
Спасибо за видео! Было интересно.
Пожалуй, лучший материал по Си на русском ютубе! А можешь пожалуйста объяснить зачем в .c файле код в #ifndef? Я учусь в школе программирования, и в первый раз вижу такой стиль. Может направишь на сторонний материал, чтобы это понять. Про стековый кадр и регистры bp sp тоже конечно интересно))
То есть я знаю, что это деректива препроцессора, которая означает что, если define *.c не определен, то его нужно определить, но все равно не понимаю зачем это в Си файле. До этого видел такую конструкцию только в хедерах. И еще вопрос, где все же лучше подключать библиотеки? В Си файлах или в хедерах? У меня на учебе поголовно все делают это в хедере. Это просто кто как предпочитает? Или же есть какой-то моветон?
#ifndef в си файле возможно и не требуется. Общий смысл такой конструкции - избегание повторного включения заголовочного файла и, соответственно, повторного определения структур, типов данных и т.д.. Подобный стиль оформления я встретил в книге по Borland C++.
Если под подключением библиотеки имеется в виду конструкция #include, то всё зависит от ситуации. Если рассмотреть подключение какой-нибудь сторонней библиотеки, то в её хедере есть только те директивы #include, которые требуются для определения необходимых ей типов данных. Хотя сама библиотека может использовать другие модули, подключая их заголовочные файлы в своей реализации (внутри .c). Хедер (заголовочный файл) - это ещё и "интерфейс" для тех, кто захочет воспользоваться библиотекой (или модулем). На мой взгляд, нет необходимости указывать определения тех конструкций, которые используются только "под капотом".
Так атмосферно
Я в восторге от простоты объяснения! Я узнал о семантике и синтаксисе Си больше, чем за 300 страниц книги по Си. Как я понимаю, стек в сути - это односторонний связный список? И второй вопрос: размер передаваемой для выделения памяти должно как-то коррелировать с размером машинного слова для ускорения работы стека?
Стек не обязательно является списком. Односторонний связанный список - это один из вариантов реализации. Стеком вполне может быть массив. Суть в порядке чтения/удаления и записи/добавления элементов.
В данном видео стек-список - это абстрактная структура, сильно отличающаяся от того же стека программы (что в примере с объектным кодом). Цель сравнения в выделении существенных признаков стека как такового. Относительно второго вопроса можно вспомнить, что в структурах (struct) по умолчанию установлено выравнивание в 4 байта для элементов , что помогает оптимизировать работу компилятора. Будет ли лучше работать оптимизация, если применить подобный метод для памяти - трудно сказать.
Дааа, я учил Pascal потом на Delphi перешел в 90х. Как в Си все сложно! Зная что есть намного легче путь ;)
Иногда возникает желание углубиться в детали) Си даёт такую возможность
@@tripledistillation1755 Да, познавая на Си алгоритм LZW я это прочувствовал =)
Сделай, пожалуйста, продолжение про стековый кадр и регистры. И ещё момент: пробую переписывать твои уроки сразу в открытое окно редактора при запущенном видео (думаю, так многие тут делают). Немного не удобно, что текст на видео располежен строго по середине, и окно редактора приходится вжимать в правую область экрана, сильно ограничивая обзор. Не мог бы ты в последующих уроках немного сместить текст влево (немного сократив ширину фпейма с директорией проекта, например)? Но всё равно спасибо за уроки, они очень помогают!
Спасибо. Пожелания будут учтены
Очень интересно
Круто
стек в Си. В смысле стек в куче на Си :Ь.
А я то подумал тут про работу кэшами памяти будет
а почему мы не очищаем указатель next, когла удаляем элемент из стека?
Если мы это сделаем, то удалим информацию о следующем элементе, потеряв таким образом связь с его содержимым
7:00 ну вообще-то это виртуальный стек, а не настоящий. То есть на самом деле реализация является связным списком. А чтобы сделать стек, надо сразу выделить память на весь стек, и уже в нём копаться как массиве структур с обратным индексом, и с указателями.
Так и есть. Я взял самое общее определение из тех, что нашел. А реализация подобрана так, чтобы использовать её в последующих проектах
А если потом не хватит емкости стека? И что такое настоящий стек? :-)
А можно подробный разбор указатель🙏🙏🙏
Что такое "указатель"? Это имеется в виду?
@@tripledistillation1755 ну да, но хочется глобально что-то, ведь у нас массив это указатель, в стеках указатели, можно функции делать на указатели, почему мы, если в функцию хотим передать массив, то передаем именно указатель, почему если мы имеем int* a и int* b то если сделать b = a, а потом менять b то и а поменяется, ну вот что-то такое, потому что, как я понял, указатели это вообще очень основополагающая тема, а каких-то толковых разборов нет(
Ага, хотелось бы, весь мехмат на Вас подпишется
@@kolyaserebryakov4898 ой ё ёй, а это кста да
Очень приятно знать, что есть зрители с мехмата.
Для какого процессора приведен листинг? Это совсем не похоже на x86 ?
x86_64
для чего делать free отдельно для sn->name, sn->data если в конце концов делаем free для sn ?
sn, sn->name и sn->data - это указатели на три разных области памяти. Все три области выделены динамически и ни одна из них не является частью другой. Следовательно, free для sn не повлечет за собой освобождение двух других областей.
Представьте, что у вас есть огромная кладовка, в которой имеется банка с огурцами и, где-то ещё, банка с помидорами. В руках вы держете записную книжку, в которой указаны места расположения банок. Если сразу выбросить книжку, банки никуда не денутся, но найти их будет сложновато. А вот если по записям найти продукты и достать их из кладовки, то книжка вам больше не нужна, так как описывает то, чего нет. Тут sn - указатель на книжку, sn->name - на огурцы, sn->data - на помидоры)
Обойтись одной процедурой free(sn) можно тогда, когда значения указателей sn->name и sn->data получены напрямую от пользователя и он берет ответственность за их природу. Код модуля уменьшится, но в этом случае стек будет лишь вносить порядок в существующий набор данных, а пользователю придется тратить время на "обвязку" и просчет возможных ошибок.
В Java, например, можно присвоить переменной значение nil, а "сборщик мусора" сам удалит из памяти то, на что нет ни одной ссылки в коде.
В C никто не будет следить за утечками памяти, кроме самого программиста. Это, на мой взгляд, очень важный "воспитующий" фактор, заставляющий вникать в суть вещей.
Спасибо за вопрос
Таки младиж винна навчатитсь у розумних!
Ну не видно же!!!
Ожидал общепринятый стек технологий для построения приложений профессионального уровня
Что подразумевается под стеком технологий для построения приложений профессионального уровня? Какие существуют критерии для приложений, чтобы зафиксировать этот профессиональный уровень? Общепринятый в каком масштабе? Я не профессионал, поэтому было бы интересно узнать
для профессионального уровня в интернете почти ничего нет! даже стандартные библиотеки все в говне! все хорошие библиотечки не выходят за рамки коммерческих фирм.
@@nRADRUS Хороши ли библиотеки в рамках коммерческих фирм - вопрос спорный. Со стороны обыкновенного пользователя "профессиональное приложение" - это очередной новый мессенджер со старым функционалом, но зато кладущий на лопатки более мощный процессор.
Странно, я вроде оставлял ответ, даже с ссылками на материалы
Под стеком технологий я имел в виду набор технологий, используемые при разработке приложении. Для веб приложений со стороны бэка это обычно веб фреймворк + орм/query builder. Если смотреть в контексте всего приложения и его работы, то я бы сказал ось + веб сервер + бд (часто можно слышать про LAMP).
Не знаю, если честно, какие есть для сишки варианты, для шарпа могу назвать ASP NET + EFCore/NHibernate/Raw queries.
Есть еще такая вещь, как DI, в шарпе и Java в основном видел, в плюсах hydra есть, но я услышал о ней лишь 1 раз
Спасибо. Возьму на заметку
бамп
бамп