CppCast: физические единицы и система величин
Гость подкаста рассказывает о своей библиотеке физических единиц (и величин) mp-units, о том, почему v2 представляет собой полностью измененный дизайн по сравнению с предыдущей версией и о том, насколько важно включение системы величин в этот новый дизайн.
Открыть сайт
Гость подкаста рассказывает о своей библиотеке физических единиц (и величин) mp-units, о том, почему v2 представляет собой полностью измененный дизайн по сравнению с предыдущей версией и о том, насколько важно включение системы величин в этот новый дизайн.
Открыть сайт
Алгоритм lexicographic_compare
Алгоритм lexicographical_compare используется для лексикографического сравнения двух диапазонов элементов, таких как векторы или строки. Он находится в заголовочном файле .
Алгоритм принимает 2 диапазона элементов для сравнения, сравнивает элементы попарно, используя оператор < и возвращает true, если первый диапазон меньше второго, или false в противном случае.
Работает для любых типов данных, которые можно сравнивать с помощью <.
#код
Алгоритм lexicographical_compare используется для лексикографического сравнения двух диапазонов элементов, таких как векторы или строки. Он находится в заголовочном файле .
Алгоритм принимает 2 диапазона элементов для сравнения, сравнивает элементы попарно, используя оператор < и возвращает true, если первый диапазон меньше второго, или false в противном случае.
Работает для любых типов данных, которые можно сравнивать с помощью <.
#код
Что такое специализация шаблона?
Специализация шаблона — это возможность создать отдельную реализацию шаблонной функции или класса для конкретных типов параметров. Это позволяет оптимизировать шаблонные решения для частных случаев.
Например, можно создать специализацию std::vector для bool, которая будет хранить данные в битовых полях, а не как отдельные элементы.
При вызове шаблона компилятор будет искать специализацию для конкретных типов и использовать ее, если она есть. В противном случае используется обобщенная реализация.
#вопросы_с_собеседований
Специализация шаблона — это возможность создать отдельную реализацию шаблонной функции или класса для конкретных типов параметров. Это позволяет оптимизировать шаблонные решения для частных случаев.
Например, можно создать специализацию std::vector для bool, которая будет хранить данные в битовых полях, а не как отдельные элементы.
При вызове шаблона компилятор будет искать специализацию для конкретных типов и использовать ее, если она есть. В противном случае используется обобщенная реализация.
#вопросы_с_собеседований
std::pair
std::pair — это шаблон класса из стандартной библиотеки, который инкапсулирует пару значений разных типов.
Он часто используется для возврата нескольких значений из функции.
В этом примере getStats возвращает пару значений — сумму и среднее элементов массива. С помощью std::pair эти значения упаковываются в один возвращаемый объект. В main используется structured binding для распаковки пары в переменные sum и avg.
#код
std::pair — это шаблон класса из стандартной библиотеки, который инкапсулирует пару значений разных типов.
Он часто используется для возврата нескольких значений из функции.
В этом примере getStats возвращает пару значений — сумму и среднее элементов массива. С помощью std::pair эти значения упаковываются в один возвращаемый объект. В main используется structured binding для распаковки пары в переменные sum и avg.
#код
Не используйте атрибуты [[likely]] или [[unlikely]].
В C++20 появились атрибуты [[likely]] и [[unlikely]] как способ дать программисту подсказку по оптимизации своей реализации. Почему же это не стоит использовать?
Читать статью
В C++20 появились атрибуты [[likely]] и [[unlikely]] как способ дать программисту подсказку по оптимизации своей реализации. Почему же это не стоит использовать?
Читать статью
Очередной #дайджест по С++:
✍️ Backend Driven UI с точки зрения бэкенда: к чему готовиться, если вы решили на него перейти
Многим знаком подход Backend Driven UI. С его помощью можно создавать новые страницы, запускать А/B-тесты, легко менять флоу в любое время и сразу на всех платформах. И при этом не надо долго и мучительно перевыкатывать приложение.
✍️ C# делегаты изнутри. Можно ли расширить С++ стандарт для поддержки делегатов в стиле C#
Чисто техническая статья, рассматривается тема, которая заявлена в заголовке, плюс разные практические методы, которые в этом будут полезны.
✍️ import CMake; Эксперимент окончен!
Наконец эксперимент завершен, и в CMake 3.28 включена официальная поддержка именованных модулей C++20 без необходимости установки переменной CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API.
✍️ Как использовать std::span из C++20
В этой статье рассмотрен std::span, который является более универсальным, чем string_view, и может помочь в работе с произвольными смежными коллекциями.
✍️ Backend Driven UI с точки зрения бэкенда: к чему готовиться, если вы решили на него перейти
Многим знаком подход Backend Driven UI. С его помощью можно создавать новые страницы, запускать А/B-тесты, легко менять флоу в любое время и сразу на всех платформах. И при этом не надо долго и мучительно перевыкатывать приложение.
✍️ C# делегаты изнутри. Можно ли расширить С++ стандарт для поддержки делегатов в стиле C#
Чисто техническая статья, рассматривается тема, которая заявлена в заголовке, плюс разные практические методы, которые в этом будут полезны.
✍️ import CMake; Эксперимент окончен!
Наконец эксперимент завершен, и в CMake 3.28 включена официальная поддержка именованных модулей C++20 без необходимости установки переменной CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API.
✍️ Как использовать std::span из C++20
В этой статье рассмотрен std::span, который является более универсальным, чем string_view, и может помочь в работе с произвольными смежными коллекциями.
Как часто вы ездите в офис? Сколько раз в неделю?
#интерактив
#интерактив
for-each циклы
Цикл for-each — это удобный способ перебрать все элементы контейнера (массива, вектора и т. д.). Синтаксис:
for (type element : container) {
// тело цикла
}
Цикл последовательно проходит по всем элементам контейнера и записывает каждый в переменную element.
#код
Цикл for-each — это удобный способ перебрать все элементы контейнера (массива, вектора и т. д.). Синтаксис:
for (type element : container) {
// тело цикла
}
Цикл последовательно проходит по всем элементам контейнера и записывает каждый в переменную element.
#код
Что такое internal linkage?
internal linkage (внутреннее связывание) означает, что имя (например, переменная или функция) видимо и доступно только в пределах файла (или, точнее, в пределах трансляционной единицы), в котором оно определено. Это означает, что если у вас есть два разных файла с исходным кодом, и в каждом из них определено имя с внутренней связью, то эти два имени считаются разными и не конфликтуют друг с другом.
Внутреннюю связь в C++ можно установить несколькими способами. Например, если вы определите переменную или функцию как static, она будет иметь внутреннюю связь. Также, имена в безымянных пространствах имен (anonymous namespaces) имеют внутреннюю связь.
#вопросы_с_собеседований
internal linkage (внутреннее связывание) означает, что имя (например, переменная или функция) видимо и доступно только в пределах файла (или, точнее, в пределах трансляционной единицы), в котором оно определено. Это означает, что если у вас есть два разных файла с исходным кодом, и в каждом из них определено имя с внутренней связью, то эти два имени считаются разными и не конфликтуют друг с другом.
Внутреннюю связь в C++ можно установить несколькими способами. Например, если вы определите переменную или функцию как static, она будет иметь внутреннюю связь. Также, имена в безымянных пространствах имен (anonymous namespaces) имеют внутреннюю связь.
#вопросы_с_собеседований
requires clause
requires clause в С++20 — это новый синтаксис для задания требований к шаблонам, альтернативный requires-выражениям.
requires clause позволяет задавать требования к типам непосредственно при объявлении шаблона. Это делает код более читабельным и понятным.
Requires clause применяется для:
— Проверки наличия определенных возможностей у типов-параметров шаблонов.
— Ограничения допустимых типов-параметров.
— Условного компилирования шаблонов в зависимости от типов.
В примере requires clause гарантирует, что функция add будет работать только с целочисленными типами.
Это делает намерения программиста явными и позволяет лучше контролировать вызовы шаблона.
#код
requires clause в С++20 — это новый синтаксис для задания требований к шаблонам, альтернативный requires-выражениям.
requires clause позволяет задавать требования к типам непосредственно при объявлении шаблона. Это делает код более читабельным и понятным.
Requires clause применяется для:
— Проверки наличия определенных возможностей у типов-параметров шаблонов.
— Ограничения допустимых типов-параметров.
— Условного компилирования шаблонов в зависимости от типов.
В примере requires clause гарантирует, что функция add будет работать только с целочисленными типами.
Это делает намерения программиста явными и позволяет лучше контролировать вызовы шаблона.
#код
Как избежать deadlock
Deadlock (взаимная блокировка) возникает, когда два или более потока заблокированы в ожидании ресурса, который удерживается другим потоком.
Чтобы избежать deadlock, нужно следовать следующим правилам:
— Не блокировать ресурсы в разном порядке в разных потоках.
— Не удерживать блокировку во время выполнения долгих операций.
— Использовать lock_guard или unique_lock вместо явных lock/unlock.
— Избегать вложенных блокировок одного и того же мьютекса.
— Применять порядок блокировки ресурсов, например, всегда в алфавитном порядке.
— Использовать мьютексы только для защиты данных, а не для управления логикой.
Соблюдая эти правила, можно предотвратить ситуации взаимной блокировки потоков и построить корректную многопоточную логику.
#код
Deadlock (взаимная блокировка) возникает, когда два или более потока заблокированы в ожидании ресурса, который удерживается другим потоком.
Чтобы избежать deadlock, нужно следовать следующим правилам:
— Не блокировать ресурсы в разном порядке в разных потоках.
— Не удерживать блокировку во время выполнения долгих операций.
— Использовать lock_guard или unique_lock вместо явных lock/unlock.
— Избегать вложенных блокировок одного и того же мьютекса.
— Применять порядок блокировки ресурсов, например, всегда в алфавитном порядке.
— Использовать мьютексы только для защиты данных, а не для управления логикой.
Соблюдая эти правила, можно предотвратить ситуации взаимной блокировки потоков и построить корректную многопоточную логику.
#код
Какой самый редактор кода для разработки на С++? VIm? Аргументируйте :)
#интерактив
#интерактив
This media is not supported in your browser
VIEW IN TELEGRAM
Очередной #дайджест по С++
⭕ Считаем медиану быстрее numpy — нестандартный разбор способу вычисления медианы массива значений с плавающей точкой
⭕ Последние обновления для CMake в Visual Studio — выкатили несколько новых улучшений, таких как упрощенная навигация по источникам и возможность исключать из представления настроенные целевые объекты
⭕ Единственная структура данных, которая покрывает всё — в видео собрана вся база для тех, кто начинает или пытается окунуться в структуры данных, и конкретно в ассоциативные массивы
⭕ Пишем printf на языке ассемблера FASM — printf будет минималистичным и ограниченным лишь тремя-четырьмя спец-символами: %s, %c, %d и %%, но без реализации с плавающими числами
⭕ Microsoft Ignite 2023 уже не за горами — обзор дискуссий для разработчиков, которые планируется транслировать в прямом эфире во время Ignite 2023
⭕ Считаем медиану быстрее numpy — нестандартный разбор способу вычисления медианы массива значений с плавающей точкой
⭕ Последние обновления для CMake в Visual Studio — выкатили несколько новых улучшений, таких как упрощенная навигация по источникам и возможность исключать из представления настроенные целевые объекты
⭕ Единственная структура данных, которая покрывает всё — в видео собрана вся база для тех, кто начинает или пытается окунуться в структуры данных, и конкретно в ассоциативные массивы
⭕ Пишем printf на языке ассемблера FASM — printf будет минималистичным и ограниченным лишь тремя-четырьмя спец-символами: %s, %c, %d и %%, но без реализации с плавающими числами
⭕ Microsoft Ignite 2023 уже не за горами — обзор дискуссий для разработчиков, которые планируется транслировать в прямом эфире во время Ignite 2023
Сколько уровней существует в безопасности исключений?
Anonymous Quiz
9%
1
33%
3
15%
4
10%
2
32%
Ни один из вариантов
😱🤦♂️ Опечатки, нулевые указатели и коварный таб: 33 фрагмента в библиотеке GTK
GTK — популярный фреймворк с открытым исходным кодом для создания графических интерфейсов. Библиотека позволяет кроссплатформенно реализовывать графический пользовательский интерфейс. Полностью бесплатна и имеет открытый исходный код, лицензированный под GNU GPL, что позволяет использовать её в любых проектах (даже коммерческих).
На примерах своего проекта, автор показывает, как можно анализировать ошибки в коде, опечатки и неточности.
Подобные проверки не являются эффективным способом использования анализатора, а только демонстрируют его возможность находить баги и помогать при обзорах кода. Статический анализатор следует использовать регулярно, а не от случая к случаю.
Читать статью
#гайд
GTK — популярный фреймворк с открытым исходным кодом для создания графических интерфейсов. Библиотека позволяет кроссплатформенно реализовывать графический пользовательский интерфейс. Полностью бесплатна и имеет открытый исходный код, лицензированный под GNU GPL, что позволяет использовать её в любых проектах (даже коммерческих).
На примерах своего проекта, автор показывает, как можно анализировать ошибки в коде, опечатки и неточности.
Подобные проверки не являются эффективным способом использования анализатора, а только демонстрируют его возможность находить баги и помогать при обзорах кода. Статический анализатор следует использовать регулярно, а не от случая к случаю.
Читать статью
#гайд
This media is not supported in your browser
VIEW IN TELEGRAM
#memes
Когда решил помочь коллеге с задачей, но сделал только хуже, ну в принципе как и предполагалось
Когда решил помочь коллеге с задачей, но сделал только хуже, ну в принципе как и предполагалось
🧜♂️🧜♂️ Погружение в Telegram API через TDLib
Пришла пора узнать, как сделать свой клиент для Telegram, что такое TL-схема и TDLib.
Прежде чем начать
Telegram поощряет, ну или по крайней мере не наказывает, за разработку пользовательских клиентов. Для создания клиента необходимо придерживаться следующих правил:
➖ Необходимо использовать свой уникальный APP_ID
➖ Необходимо следовать правилам безопасности
➖ Можно расширять функциональность Telegram, но нельзя заставлять пользователей других приложений переходить в ваше приложение
➖ Нельзя нарушать базовые механики мессенджера, например, делать «невидимки» и «нечитайки»
➖ Нельзя выполнять действия без ведома пользователя, например, автоматически подписываться на канал или рассылать сообщения
➖ Если клиент обеспечивает доступ к каналам, то необходимо также реализовать функциональность «спонсированных сообщений»
➖ Нельзя выдавать приложение за официальное
➖ Монетизировать можно любым легальным способам, если о нем написано на странице приложения
Нарушение этих правил приведет к предупреждению, а его игнорирование — к отключению API для вашего приложения. Также команда Telegram может запросить удалить ваше приложение из магазинов.
Также не стоит забывать, что деструктивные действия, такие как спам и распространение незаконного контента, вне зависимости от клиента являются нарушением и могут привести к бану аккаунта.
Подробнее читайте тут
Пришла пора узнать, как сделать свой клиент для Telegram, что такое TL-схема и TDLib.
Прежде чем начать
Telegram поощряет, ну или по крайней мере не наказывает, за разработку пользовательских клиентов. Для создания клиента необходимо придерживаться следующих правил:
➖ Необходимо использовать свой уникальный APP_ID
➖ Необходимо следовать правилам безопасности
➖ Можно расширять функциональность Telegram, но нельзя заставлять пользователей других приложений переходить в ваше приложение
➖ Нельзя нарушать базовые механики мессенджера, например, делать «невидимки» и «нечитайки»
➖ Нельзя выполнять действия без ведома пользователя, например, автоматически подписываться на канал или рассылать сообщения
➖ Если клиент обеспечивает доступ к каналам, то необходимо также реализовать функциональность «спонсированных сообщений»
➖ Нельзя выдавать приложение за официальное
➖ Монетизировать можно любым легальным способам, если о нем написано на странице приложения
Нарушение этих правил приведет к предупреждению, а его игнорирование — к отключению API для вашего приложения. Также команда Telegram может запросить удалить ваше приложение из магазинов.
Также не стоит забывать, что деструктивные действия, такие как спам и распространение незаконного контента, вне зависимости от клиента являются нарушением и могут привести к бану аккаунта.
Подробнее читайте тут
🧑🍳🧑🎓 Релиз vcpkg 2023.10.19
Стала доступна версия менеджера пакетов vcpkg 2023.10.19. Автор статьи кратко излагает изменения, случившиеся с 10 августа 2023 года по 19 октября 2023 года для репозиториев Microsoft/vcpkg, Microsoft/vcpkg-tool и Microsoft/vcpkg-docs на GitHub.
Некоторая статистика за этот период:
🔹 В реестр с открытым исходным кодом было добавлено 53 новых порта. Если вы не знакомы с термином «порт», то это пакеты, которые создаются из исходного кода и обычно представляют собой библиотеки C/C++.
🔹 В существующие порты было внесено 729 обновлений.
🔹 В настоящее время в public registry vcpkg доступно 2 318 библиотек.
🔹 34 участника представили PRs или приняли участие в обсуждениях в основном репозитории.
🔹 Основной vcpkg repo имеет более 5700 форков и 19 900 звездочек на GitHub.
Более детально о релизе читайте здесь
Стала доступна версия менеджера пакетов vcpkg 2023.10.19. Автор статьи кратко излагает изменения, случившиеся с 10 августа 2023 года по 19 октября 2023 года для репозиториев Microsoft/vcpkg, Microsoft/vcpkg-tool и Microsoft/vcpkg-docs на GitHub.
Некоторая статистика за этот период:
🔹 В реестр с открытым исходным кодом было добавлено 53 новых порта. Если вы не знакомы с термином «порт», то это пакеты, которые создаются из исходного кода и обычно представляют собой библиотеки C/C++.
🔹 В существующие порты было внесено 729 обновлений.
🔹 В настоящее время в public registry vcpkg доступно 2 318 библиотек.
🔹 34 участника представили PRs или приняли участие в обсуждениях в основном репозитории.
🔹 Основной vcpkg repo имеет более 5700 форков и 19 900 звездочек на GitHub.
Более детально о релизе читайте здесь
#вопросы_с_собеседований
Как работает std::shared_ptr?
➖ std::shared_ptr — это умный указатель, который использует подсчет ссылок для управления жизненным циклом объекта. Это означает, что несколько shared_ptr могут указывать на один и тот же объект, и он будет удален только тогда, когда все shared_ptr, указывающие на него, будут уничтожены.
➖ Когда вы создаете shared_ptr, он увеличивает счетчик ссылок на объект. Когда shared_ptr уничтожается, он уменьшает счетчик ссылок. Если счетчик ссылок достигает нуля, это означает, что больше нет shared_ptr, указывающих на объект, и он может быть безопасно удален.
➖ std::shared_ptr также предоставляет набор методов для управления объектом, таких как reset, который позволяет заменить текущий объект новым, и use_count, который возвращает текущее количество shared_ptr, указывающих на объект.
Вот простой пример использования std::shared_ptr:
#include
#include
int main() {
std::shared_ptr ptr1(new int(5));
std::cout << *ptr1 << std::endl; // выводит 5
std::cout << ptr1.use_count() << std::endl; // выводит 1
{
std::shared_ptr ptr2 = ptr1;
std::cout << ptr1.use_count() << std::endl; // выводит 2
}
std::cout << ptr1.use_count() << std::endl; // выводит 1
}
Создаем std::shared_ptr, который владеет динамически выделенным объектом типа int. Затем еще один shared_ptr, который указывает на тот же объект. Когда второй shared_ptr выходит из области видимости и уничтожается, счетчик ссылок уменьшается, но объект не удаляется, потому что все еще есть другой shared_ptr, указывающий на него.
Как работает std::shared_ptr?
➖ std::shared_ptr — это умный указатель, который использует подсчет ссылок для управления жизненным циклом объекта. Это означает, что несколько shared_ptr могут указывать на один и тот же объект, и он будет удален только тогда, когда все shared_ptr, указывающие на него, будут уничтожены.
➖ Когда вы создаете shared_ptr, он увеличивает счетчик ссылок на объект. Когда shared_ptr уничтожается, он уменьшает счетчик ссылок. Если счетчик ссылок достигает нуля, это означает, что больше нет shared_ptr, указывающих на объект, и он может быть безопасно удален.
➖ std::shared_ptr также предоставляет набор методов для управления объектом, таких как reset, который позволяет заменить текущий объект новым, и use_count, который возвращает текущее количество shared_ptr, указывающих на объект.
Вот простой пример использования std::shared_ptr:
#include
#include
int main() {
std::shared_ptr ptr1(new int(5));
std::cout << *ptr1 << std::endl; // выводит 5
std::cout << ptr1.use_count() << std::endl; // выводит 1
{
std::shared_ptr ptr2 = ptr1;
std::cout << ptr1.use_count() << std::endl; // выводит 2
}
std::cout << ptr1.use_count() << std::endl; // выводит 1
}
Создаем std::shared_ptr, который владеет динамически выделенным объектом типа int. Затем еще один shared_ptr, который указывает на тот же объект. Когда второй shared_ptr выходит из области видимости и уничтожается, счетчик ссылок уменьшается, но объект не удаляется, потому что все еще есть другой shared_ptr, указывающий на него.