EBFE: software internals – Telegram
EBFE: software internals
301 subscribers
226 photos
45 videos
38 files
97 links
Авторский канал Алексея Никольского.
Пишу код операционок и гипервизоров больше 20 лет и читаю лекции студентам.
Делюсь своими мыслями, интересными материалами, мемасиками и всегда рад общению!

Моя мастерская: https://news.1rj.ru/str/itmosysint
Download Telegram
Язык C++ действительно - это очень мощный инструмент, и требует от программиста не только знаний но и чувства прекрасного. Все верно говорил А. Н. Туполев о том, что некрасивый самолёт не полетит, это верно во многих инженерных дисциплинах, и программирование не исключение.
Одно из преимуществ C++, это наличие встроенных в язык конструкций для создания ограничений (constraints). Тут вам и области видимости (public, protected, private), и конечно же ключевое слово const. Но штука в том, что почему-то почти на каждое ограничение есть способ его отменить. Я не говорю про вариант закастить что угодно в (void*) и погнали - тут уж никакой private не спасет, а о тех средствах что встроены в язык - на private есть ключевое слово friend, а на слово const есть const_cast и ключевое слово mutable. Про последнее и речь.
Например, сделаем класс:
class A { int x; int y; int c; void increment() { x++; y++; c++; } int summ() { return x + y; } };
Если внимательно посмотреть на класс,то просится само собой поставить ограничение const на метод summ - поскольку он ничего не меняет в состоянии класса. Сделано:
class A { int x; int y; int c; void increment() { x++; y++; c++; } int summ() const { return x + y; } };
Теперь мы не можем написать что-то типо такого:
class A { int x; int y; int c; void increment() { x++; y++; c++; } int summ() const { с++; return x + y; } };
Компилятор нас остановит от такой роковой ошибки - и напишет все то что о нас думает....Мы теперь можем возмутиться и проучить компилятор с помощью слова mutable:
class A { int x; int y; mutable int c; void increment() { x++; y++; c++; } int summ() const { с++; return x + y; }};
Ура! Мы победили!
Если серьёзно, то слово mutable позволяет менять поля, помеченные им, даже в константных методах. Надеюсь всем понятно, что разработчики C++ отнюдь не идиоты и добавили целое ключевое слово не для того, чтобы мы смогли победить назойливый компилятор (как-нибудь напишу про это подробнее). В чем же дело?А дело в формулировке: const у метода класса не позволяет методу менять состояние класса! То есть слово mutable помечает поля, которые не относятся к состоянию класса. Это как? Класс же описывает объекты, а объект = состояние, поведение и идентичность. Где тут что-то еще? Все очень просто: например вам нужен отладочный счётчик, чтобы посмотреть как часто вызывается метод в объектах; или вам надо закэшировать предварительно посчитанные значения или данные, итд. То есть, чаще всего речь о служебных функциях, или об оптимизации. Это очень классно, ведь в сложных и больших проектах такая тема встречается очень часто - и разработчики C++ об этом знают, поэтому добавили такое ключевое слово, чтобы вам не пришлось переписывать пол системы и снимать важные ограничения (убирать const - так не надо делать), из-за отладочного счётчика, который вам вдруг понадобился.
Очевидно, такая гибкость и свобода дает программисту не только мощь, но и ответственность - код надо писать внимательно и соблюдать баланс, и не делать так, как я в шуточном примере)
Всем интересных инженерных задач и красивых реализаций!
💋6👍2
Я включил комментарии. Можно сюда писать для предыдущего поста
🍌2
💯5🤣2🔥1😁1
Channel photo updated
Задачка на ночь.
В одну строку препроцессора С добавьте во все printf в начале того, что он печатает - номер строки, на которой используется printf. (Правильный ответ будет в воскресенье).
🤔1
EBFE: software internals
Задачка на ночь. В одну строку препроцессора С добавьте во все printf в начале того, что он печатает - номер строки, на которой используется printf. (Правильный ответ будет в воскресенье).
Конкретизирую. Есть код на несколько тысяч строк. В коде используется много printf. Нaпример: printf("Setting parameter %d = %x!", i, val);
Задача добавить где-то в начале файла некий макрос #define, который бы все такие printf поменял бы так, чтобы перед каждым текстом печатался бы номер строки на которой этот printf объявлен. Из примера печатать должен Типо так: 345: Setting parameter 5 = f!
🤔3
Media is too big
VIEW IN TELEGRAM
#этобаза Базовая настройка проектов Visual Studio для C/C++
💋4❤‍🔥3
Media is too big
VIEW IN TELEGRAM
#этобаза Рассказ о том как работают настройки проектов а Visual Studio
💋4❤‍🔥3
Forwarded from Dev Meme / devmeme
😁8👾3
💋7🥰3🔥2🏆2😎1👾1
Пробую разные форматы. Через какое-то время проведём опрос, чтобы понять, что заходит, а что нет
👍4👨‍💻2🥰1🕊1🤝1
Кстати, если знаете людей, которым такие материалы были бы интересны, то приглашайте. Если у вас ссылка не сохранилась, то дам.
😁3👍1🆒1
И ещё: постепенно планируют добавлять материалы и более сложные. Их есть у меня.
5😈4😢2
EBFE: software internals
И ещё: постепенно планируют добавлять материалы и более сложные. Их есть у меня.
Будут материалы разных уровней, так что думаю будет всем что поизучать
🥰31🤝1
😁6🤪2
EBFE: software internals
Задачка на ночь. В одну строку препроцессора С добавьте во все printf в начале того, что он печатает - номер строки, на которой используется printf. (Правильный ответ будет в воскресенье).
Ответ достаточно прост:
#define printf(a, ...) printf("%d: " a, LINE, ##__VA_ARGS__)
printf заменяем макросом на.... printf
... - макрос с переменным количеством параметров
"%d: " - формат для номера строки
LINE - автоматически заменится на номер строки
## - конкатинация
VA_ARGS - заменится на то что сунули макросу printf
5🍓3🌚2💋1
cpp_lections_v1.zip
38.5 KB
Текущий код с лекций по C++/WinAPI. #метериалылекций
4💋4🏆2