Применение указателя unique_ptr
В функции foo1 мы выделяем память для указателя ptr и затем освобождаем ее с помощью оператора delete. Однако, если произойдет исключение во время работы функции, то память не будет освобождена, что приведет к утечке памяти.
Во втором примере мы используем std::unique_ptr, который выделяет память при инициализации и освобождает память при уничтожении объекта.
Таким образом, мы можем гарантировать, что ресурсы будут корректно освобождены, даже в случае исключения.
Данный тип указателей полезен, когда нужен указатель на объект, на который НЕ будет других указателей и который будет удален после удаления указателя.
#код
В функции foo1 мы выделяем память для указателя ptr и затем освобождаем ее с помощью оператора delete. Однако, если произойдет исключение во время работы функции, то память не будет освобождена, что приведет к утечке памяти.
Во втором примере мы используем std::unique_ptr, который выделяет память при инициализации и освобождает память при уничтожении объекта.
Таким образом, мы можем гарантировать, что ресурсы будут корректно освобождены, даже в случае исключения.
Данный тип указателей полезен, когда нужен указатель на объект, на который НЕ будет других указателей и который будет удален после удаления указателя.
#код
vptr (Virtual Pointer)
vptr — это указатель на виртуальную таблицу, которая содержит информацию о виртуальных функциях класса. vptr используется при вызове виртуальных функций, а также при операции приведения типов с помощью dynamic_cast.
В этом примере мы создали два класса: Base и Derived. Класс Derived наследуется от класса Base и переопределяет его виртуальную функцию func(). Затем мы создали объект класса Derived и присвоили его адрес указателю на базовый класс Base.
Затем вызываем функцию func() с помощью указателя на базовый класс. Здесь vptr смотрит на таблицу виртуальных функций, чтобы определить, какую функцию вызывать.
Результатом будет вывод "Derived", так как мы переопределили функцию в классе Derived.
#код
vptr — это указатель на виртуальную таблицу, которая содержит информацию о виртуальных функциях класса. vptr используется при вызове виртуальных функций, а также при операции приведения типов с помощью dynamic_cast.
В этом примере мы создали два класса: Base и Derived. Класс Derived наследуется от класса Base и переопределяет его виртуальную функцию func(). Затем мы создали объект класса Derived и присвоили его адрес указателю на базовый класс Base.
Затем вызываем функцию func() с помощью указателя на базовый класс. Здесь vptr смотрит на таблицу виртуальных функций, чтобы определить, какую функцию вызывать.
Результатом будет вывод "Derived", так как мы переопределили функцию в классе Derived.
#код
Советы и рекомендации по управлению памятью
В прошлом году я усовершенствовал свой подход к управлению памятью. С практикой это становится эффективным, простым и быстрым; обычно так же просто в использовании, как и сбор мусора, но без затрат.
Читать статью
В прошлом году я усовершенствовал свой подход к управлению памятью. С практикой это становится эффективным, простым и быстрым; обычно так же просто в использовании, как и сбор мусора, но без затрат.
Читать статью
Сколько вы тратите времени в день на работу по факту?
#интерактив
#интерактив
❗«Библиотека программиста» продолжает поиски контент-менеджера для ведения телеграм-каналов
Ищем человека, который грамотно пишет и разбирается в одной из этих тем:
👉С++
👉Frontend
👉мобильная разработка
👉Data Science
Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴
Подробнее о вакансии и форма для отклика — по ссылке.
Ждем вас в команде!
Ищем человека, который грамотно пишет и разбирается в одной из этих тем:
👉С++
👉Frontend
👉мобильная разработка
👉Data Science
Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴
Подробнее о вакансии и форма для отклика — по ссылке.
Ждем вас в команде!
namespace alias
В C++, вы можете использовать «namespace alias» (псевдоним пространства имен) для упрощения работы с длинными именами пространств имен. Это позволяет вам создать более короткий псевдоним для длинного имени пространства имен, что улучшает читаемость кода и уменьшает вероятность конфликтов имен.
Для создания псевдонима пространства имен используйте ключевое слово namespace с алиасом (псевдонимом).
#код
В C++, вы можете использовать «namespace alias» (псевдоним пространства имен) для упрощения работы с длинными именами пространств имен. Это позволяет вам создать более короткий псевдоним для длинного имени пространства имен, что улучшает читаемость кода и уменьшает вероятность конфликтов имен.
Для создания псевдонима пространства имен используйте ключевое слово namespace с алиасом (псевдонимом).
#код
Подборка лучших статей «Библиотеки программиста» за сентябрь: сохраняй в заметки, чтобы не пропустить #самыйсок
📕 ТОП-9 книг по языку программирования Go в 2023 году: от новичка до профессионала
🐍 Дорожная карта Python-разработчика в 2023 году
🎓💼 ТОП-9 не самых очевидных компаний для стажировки в ИТ
☕🛣️ Дорожная карта Java-разработчика в 2023 году
🦸⚡ 9 способов настройки градиента цели для поддержания мотивации
⚒️ ТОП-27 плагинов для Visual Studio Code в 2023
🔎💼🗺️ Как программисту искать (и найти) работу за границей в 2023 году
🔝 Приоритизация задач по методу MoSCoW: как за 5 минут научиться грамотно расставлять приоритеты
🤖 Создание собственного ИИ-бота на Python за 33 строчки кода
📊 Как я входил в IT? Результаты опроса «Библиотеки программиста»
📕 ТОП-9 книг по языку программирования Go в 2023 году: от новичка до профессионала
🐍 Дорожная карта Python-разработчика в 2023 году
🎓💼 ТОП-9 не самых очевидных компаний для стажировки в ИТ
☕🛣️ Дорожная карта Java-разработчика в 2023 году
🦸⚡ 9 способов настройки градиента цели для поддержания мотивации
⚒️ ТОП-27 плагинов для Visual Studio Code в 2023
🔎💼🗺️ Как программисту искать (и найти) работу за границей в 2023 году
🔝 Приоритизация задач по методу MoSCoW: как за 5 минут научиться грамотно расставлять приоритеты
🤖 Создание собственного ИИ-бота на Python за 33 строчки кода
📊 Как я входил в IT? Результаты опроса «Библиотеки программиста»
Placement new
Placement new — это специальный оператор, который позволяет создавать объекты в заданной области памяти, вместо выделения новой памяти для объекта. Это полезно, когда вы хотите явно контролировать расположение объектов в памяти, например, при работе с устройствами ввода-вывода или при реализации собственных аллокаторов.
Обратите внимание, что после использования объекта, созданного с помощью placement new, вы должны вызвать его деструктор явно, как показано в примере выше. Это необходимо для правильного освобождения ресурсов и избежания утечек памяти.
#код
Placement new — это специальный оператор, который позволяет создавать объекты в заданной области памяти, вместо выделения новой памяти для объекта. Это полезно, когда вы хотите явно контролировать расположение объектов в памяти, например, при работе с устройствами ввода-вывода или при реализации собственных аллокаторов.
Обратите внимание, что после использования объекта, созданного с помощью placement new, вы должны вызвать его деструктор явно, как показано в примере выше. Это необходимо для правильного освобождения ресурсов и избежания утечек памяти.
#код
Механизм маршрутизации с открытым исходным кодом для OpenStreetMap
Valhalla также включает в себя такие инструменты, как вычисление матрицы времени и расстояния, изохроны, выборку высот, сопоставление карт и оптимизацию туров.
Открыть репозиторий
Valhalla также включает в себя такие инструменты, как вычисление матрицы времени и расстояния, изохроны, выборку высот, сопоставление карт и оптимизацию туров.
Открыть репозиторий
Функции вместимости в строках
1. capacity() — функция возвращает ёмкость памяти, выделенную для строки, которая может быть равной или больше, чем размер самой строки. Дополнительное пространство выделяется таким образом, чтобы при добавлении новых символов в строку операции могли выполняться эффективно.
2. resize() — функция изменяет размер строки, его можно увеличивать или уменьшать.
3. length() — функция возвращает длину строки.
4. shrink_to_fit() — функция уменьшает ёмкость памяти строки, делает ее равной минимально возможной. Эта операция полезна для экономии дополнительной памяти, когда мы уверены, что больше не нужно добавлять символы.
1. capacity() — функция возвращает ёмкость памяти, выделенную для строки, которая может быть равной или больше, чем размер самой строки. Дополнительное пространство выделяется таким образом, чтобы при добавлении новых символов в строку операции могли выполняться эффективно.
2. resize() — функция изменяет размер строки, его можно увеличивать или уменьшать.
3. length() — функция возвращает длину строки.
4. shrink_to_fit() — функция уменьшает ёмкость памяти строки, делает ее равной минимально возможной. Эта операция полезна для экономии дополнительной памяти, когда мы уверены, что больше не нужно добавлять символы.
Что такое CI/CD и какие преимущества дает разработчику?
CI/CD означает непрерывную интеграцию и непрерывное развертывание. Это набор практик и инструментов, используемых в разработке программного обеспечения для автоматизации процесса создания, тестирования и развертывания приложений.
Непрерывная интеграция включает в себя интеграцию изменений кода от нескольких разработчиков в общий репозиторий часто, как правило, несколько раз в день. Каждая интеграция запускает автоматизированный процесс сборки и тестирования для раннего обнаружения и решения проблем интеграции.
Непрерывное развертывание (или Continuous Delivery) направлено на автоматизацию процесса развертывания программного обеспечения в производственных средах. Он включает в себя автоматизацию шагов, необходимых для упаковки, развертывания и настройки приложения.
Вот некоторые преимущества CI/CD для разработчиков C++:
1. Раннее обнаружение ошибок.
2. Более быстрый цикл обратной связи.
3. Качество и ремонтопригодность кода.
4. Сотрудничество и коммуникация между разработчиками.
5. Автоматизация сборки, тестирования и развертывания кода.
6. Непрерывное развертывание.
7. Масштабируемость.
#вопросы_с_собеседований
CI/CD означает непрерывную интеграцию и непрерывное развертывание. Это набор практик и инструментов, используемых в разработке программного обеспечения для автоматизации процесса создания, тестирования и развертывания приложений.
Непрерывная интеграция включает в себя интеграцию изменений кода от нескольких разработчиков в общий репозиторий часто, как правило, несколько раз в день. Каждая интеграция запускает автоматизированный процесс сборки и тестирования для раннего обнаружения и решения проблем интеграции.
Непрерывное развертывание (или Continuous Delivery) направлено на автоматизацию процесса развертывания программного обеспечения в производственных средах. Он включает в себя автоматизацию шагов, необходимых для упаковки, развертывания и настройки приложения.
Вот некоторые преимущества CI/CD для разработчиков C++:
1. Раннее обнаружение ошибок.
2. Более быстрый цикл обратной связи.
3. Качество и ремонтопригодность кода.
4. Сотрудничество и коммуникация между разработчиками.
5. Автоматизация сборки, тестирования и развертывания кода.
6. Непрерывное развертывание.
7. Масштабируемость.
#вопросы_с_собеседований
Декларация
Декларация — это объявление имени сущности (переменной, функции, класса и т. д.) без определения ее типа или реализации. Декларации используются для предварительного объявления сущности в программе, чтобы компилятор знал о ее существовании, но не обязан знать ее полную информацию или реализацию на этом этапе. Это полезно, когда вы хотите использовать сущность в разных частях вашей программы.
Обратите внимание, что декларации часто используются в заголовочных файлах (.h или .hpp), чтобы предоставить интерфейс к функциям или классам, а затем реализация определяется в соответствующих исходных файлах (.cpp). Это помогает разделить интерфейс и реализацию и упростить структуру проекта.
#код
Декларация — это объявление имени сущности (переменной, функции, класса и т. д.) без определения ее типа или реализации. Декларации используются для предварительного объявления сущности в программе, чтобы компилятор знал о ее существовании, но не обязан знать ее полную информацию или реализацию на этом этапе. Это полезно, когда вы хотите использовать сущность в разных частях вашей программы.
Обратите внимание, что декларации часто используются в заголовочных файлах (.h или .hpp), чтобы предоставить интерфейс к функциям или классам, а затем реализация определяется в соответствующих исходных файлах (.cpp). Это помогает разделить интерфейс и реализацию и упростить структуру проекта.
#код
Вглубь std::unordered_map: магические числа
Эта статья о том, каким странным бывает легаси — и куда же всё-таки копать, чтобы понять, что происходит. stdlibc++ опровергает даже стандартные математические понятия. Как хорошо, что это хотя бы опенсорс....
Читать статью
Эта статья о том, каким странным бывает легаси — и куда же всё-таки копать, чтобы понять, что происходит. stdlibc++ опровергает даже стандартные математические понятия. Как хорошо, что это хотя бы опенсорс....
Читать статью
Самые полезные каналы для программистов в одной подборке!
Сохраняйте себе, чтобы не потерять 💾
🔥Для всех
Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
IT-мемы
Proglib Academy — тут мы рассказываем про обучение и курсы
🐘PHP
Библиотека пхпшника
Вакансии по PHP, Symfony, Laravel
Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по PHP — код, квизы и тесты
🐍Python
Библиотека питониста
Вакансии по питону, Django, Flask
Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Python — код, квизы и тесты
☕Java
Библиотека джависта — полезные статьи по Java, новости и обучающие материалы
Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Java — код, квизы и тесты
Вакансии для java-разработчиков
👾Data Science
Библиотека Data Science — полезные статьи, новости и обучающие материалы
Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Data Science — код, квизы и тесты
Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту
🦫Go
Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go
Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Go — код, квизы и тесты
Вакансии по Go
🧠C++
Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++
Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по C++ — код, квизы и тесты
Вакансии по C++
💻Другие профильные каналы
Библиотека фронтендера
Библиотека шарписта
Библиотека мобильного разработчика
Библиотека хакера
Библиотека devops’a
Библиотека тестировщика
💼Каналы с вакансиями
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel
Вакансии по DevOps & SRE
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности
📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈
🤖Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT
Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
🔸Facebook
🔸Instagram
Сохраняйте себе, чтобы не потерять 💾
🔥Для всех
Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
IT-мемы
Proglib Academy — тут мы рассказываем про обучение и курсы
🐘PHP
Библиотека пхпшника
Вакансии по PHP, Symfony, Laravel
Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по PHP — код, квизы и тесты
🐍Python
Библиотека питониста
Вакансии по питону, Django, Flask
Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Python — код, квизы и тесты
☕Java
Библиотека джависта — полезные статьи по Java, новости и обучающие материалы
Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Java — код, квизы и тесты
Вакансии для java-разработчиков
👾Data Science
Библиотека Data Science — полезные статьи, новости и обучающие материалы
Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Data Science — код, квизы и тесты
Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту
🦫Go
Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go
Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Go — код, квизы и тесты
Вакансии по Go
🧠C++
Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++
Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по C++ — код, квизы и тесты
Вакансии по C++
💻Другие профильные каналы
Библиотека фронтендера
Библиотека шарписта
Библиотека мобильного разработчика
Библиотека хакера
Библиотека devops’a
Библиотека тестировщика
💼Каналы с вакансиями
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel
Вакансии по DevOps & SRE
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности
📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈
🤖Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT
Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
co_await, co_yield и co_return
co_await, co_yield и co_return — это ключевые слова, которые используются для реализации корутин (coroutines).
co_await используется для приостановки корутины и ожидания результата асинхронной операции.
co_yield используется для приостановки корутины и передачи управления обратно вызывающему коду.
co_return используется для завершения корутины и возврата результата.
В этом примере используются все три ключевых слова:
— co_await приостанавливает корутину create_task в начале.
— co_yield можно было бы использовать для дополнительных приостановок.
— co_return завершает корутину в конце.
#код
co_await, co_yield и co_return — это ключевые слова, которые используются для реализации корутин (coroutines).
co_await используется для приостановки корутины и ожидания результата асинхронной операции.
co_yield используется для приостановки корутины и передачи управления обратно вызывающему коду.
co_return используется для завершения корутины и возврата результата.
В этом примере используются все три ключевых слова:
— co_await приостанавливает корутину create_task в начале.
— co_yield можно было бы использовать для дополнительных приостановок.
— co_return завершает корутину в конце.
#код
Очередной #дайджест по С++:
🤖 IMSProg — программатор для CH341a в Linux
О создании полезных программ под линукс.
🤖 Поиск ошибок в проектах на основе Unreal Engine
В статическом анализаторе PVS-Studio начали появляться диагностические правила для выявления багов, специфичных для Unreal Engine проектов.
🤖 Как я делал бюджетное устройство мониторинга качества среды и что из этого вышло
Про довольно необычную автоматизацию.
🤖 Современное состояние инструментов поиска утечек памяти
Несмотря на большое количество доступных инструментов поиска утечек памяти, существует ряд ограничений применимости этих инструментов.
🤖 IMSProg — программатор для CH341a в Linux
О создании полезных программ под линукс.
🤖 Поиск ошибок в проектах на основе Unreal Engine
В статическом анализаторе PVS-Studio начали появляться диагностические правила для выявления багов, специфичных для Unreal Engine проектов.
🤖 Как я делал бюджетное устройство мониторинга качества среды и что из этого вышло
Про довольно необычную автоматизацию.
🤖 Современное состояние инструментов поиска утечек памяти
Несмотря на большое количество доступных инструментов поиска утечек памяти, существует ряд ограничений применимости этих инструментов.
Как часто вы обращаетесь к документации?
#интерактив
#интерактив
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
В чем разница между многопоточностью и асинхронностью?
Разница между многопоточностью и асинхронностью заключается в подходе к параллельному выполнению кода.
При многопоточности создаются несколько потоков управления, которые выполняются параллельно и могут разделять общие данные.
Это позволяет эффективно использовать многоядерные процессоры, но требует синхронизации доступа к общим данным с помощью мьютексов, семафоров и т. д.
Асинхронность же основана на событийной модели — код выполняется последовательно в рамках одного потока, но части кода могут приостанавливаться в ожидании каких-либо событий (например, завершения ввода-вывода).
Это позволяет избежать сложностей синхронизации, но ограничивает возможности параллелизма.
Таким образом, многопоточность эффективнее использует ресурсы процессора, а асинхронность проще в реализации и избегает проблем синхронизации.
#вопросы_с_собеседований
Разница между многопоточностью и асинхронностью заключается в подходе к параллельному выполнению кода.
При многопоточности создаются несколько потоков управления, которые выполняются параллельно и могут разделять общие данные.
Это позволяет эффективно использовать многоядерные процессоры, но требует синхронизации доступа к общим данным с помощью мьютексов, семафоров и т. д.
Асинхронность же основана на событийной модели — код выполняется последовательно в рамках одного потока, но части кода могут приостанавливаться в ожидании каких-либо событий (например, завершения ввода-вывода).
Это позволяет избежать сложностей синхронизации, но ограничивает возможности параллелизма.
Таким образом, многопоточность эффективнее использует ресурсы процессора, а асинхронность проще в реализации и избегает проблем синхронизации.
#вопросы_с_собеседований