Библиотека C/C++ разработчика | cpp, boost, qt
21K subscribers
1.57K photos
40 videos
16 files
3.74K links
Все самое полезное для плюсовика и сишника в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/d6cd2932

Наши каналы: https://yangx.top/proglibrary/9197

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
加入频道
Многопоточность на C++

Поток исполнения — независимая последовательность выполнения инструкций внутри одного процесса с общей памятью, но собственными регистрами и стеком.

Смотреть статью
Как вы предпочитаете работать: дистанционно или в офисе?
#интерактив
Cache miss

Cache miss (промах в кэше) в C++ относится к ситуации, когда процессор не может найти нужные данные в кэше, и должен обратиться к более медленной памяти (например ОЗУ), для получения этих данных.

Когда код выполняется на процессоре, процессор пытается загрузить данные или инструкции из кэша первого, второго или третьего уровня (L1, L2, L3 и так далее), прежде чем обращаться к оперативной памяти. Если данные или инструкции отсутствуют в кэше, возникает кэш-промах (cache miss), и процессор должен загрузить их из оперативной памяти, что занимает гораздо больше времени, чем доступ к данным в кэше.
#код
Очередной #дайджест по С++:

✍️ Можно ли доверить компилятору оптимизацию вашего кода?
Автор объясняет общую структуру компиляторов, пригодную для оптимизации статических языков, таких как Rust или C++.

✍️ Проверка компилятора GCC 13 с помощью PVS-Studio
Цель — обнаружить ошибки в коде GCC с помощью анализатора PVS-Studio.

✍️ Почему C++ не устаревает
Что же делает язык с 40-летней историей таким популярным и почему сегодня он только укрепляет позиции?

✍️ Как я присоединился к сообществу bug 323
Это история о баге, от которого хочется рвать на себе волосы.

✍️ Приятный разговор о знаковых и беззнаковых целых числах (с обжаркой Google)
Правильный выбор целочисленного типа — плохо изученная тема, которая привела к стандартизации проблемных интерфейсов в C++, плохо разработанным требованиям безопасности и путанице среди разработчиков.
std::atomic_thread_fence

std::atomic_thread_fence — это функция, которая устанавливает порядок синхронизации памяти для не атомарных и расслабленных атомарных доступов, как указано в аргументе order, без связанной атомарной операции.

std::atomic_thread_fence может использоваться для обеспечения правильного порядка чтения и записи в многопоточных программах.

В этом примере два потока выполняют функции write_x_then_y и read_y_then_x:

- write_x_then_y устанавливает значение атомарной переменной x равным 1, затем вызывает std::atomic_thread_fence с аргументом std::memory_order_release и устанавливает значение атомарной переменной y равным 1.

- read_y_then_x считывает значение атомарной переменной y, затем вызывает std::atomic_thread_fence с аргументом std::memory_order_acquire и считывает значение атомарной переменной x.
#код
Новая статическая идиома constexpr std::integral_constant

Небольшая заметка об улучшении, которое вы можете применять в своем коде.

Читать статью
std::midpoint

std::midpoint — это функция, которая вычисляет среднюю точку между двумя целыми числами, числами с плавающей точкой или указателями. Она возвращает половину суммы a и b, при этом не происходит переполнения.

Если a и b имеют целочисленный тип и сумма является нечетной, то результат округляется в сторону a. Если a и b имеют тип с плавающей точкой, то происходит не более одной неточной операции.
#код
Можно ли выбрасывать exception из конструктора? Какие поля будут сконструированы, какие поля будут разрушены?

в C++ выбрасывать исключения из конструктора можно. Это обычно делается, когда в процессе инициализации объекта происходит ошибка, и объект не может быть корректно сконструирован.

Если исключение выбрасывается из конструктора, то все поля, которые были успешно сконструированы до момента выброса исключения, будут корректно разрушены. Это гарантируется механизмом исключений в C++.

Важно помнить, что только те поля, которые были успешно сконструированы, будут разрушены. Если исключение выбрасывается в процессе конструирования поля, то это поле не будет разрушено, так как его конструктор не был успешно завершен.
#вопросы_с_собеседований
Позднее связывание

Позднее связывание (или динамическое связывание) — это концепция в C++, которая связывает вызов метода с его реализацией во время выполнения программы, а не на этапе компиляции. Это позволяет достичь полиморфизма и инкапсуляции, так как объекты могут вызывать методы, которые будут разрешены на основе их фактического типа, а не только статического типа.

В C++ позднее связывание реализуется с помощью виртуальных функций и ключевого слова virtual. Виртуальные функции определяются в базовом классе и могут быть переопределены в производных классах. Когда вы вызываете виртуальную функцию через указатель или ссылку на базовый класс, вызывается соответствующая реализация в производном классе на основе реального типа объекта.
#код
Статически подсчитываем количество экземпляров шаблона с нулевым временем выполнения и даже без использования стандартной библиотеки.

Смотреть код
Ключевое слово const

Ключевое слово const используется для создания констант и неизменяемых объектов.

— Const для объявления переменных: запрещает изменение объекта после инициализации.

— Const указатели и ссылки: указатель или ссылка на константный объект. Нельзя изменить объект через них, только читать.

— Функции, возвращающие const значения: гарантируют, что функция не изменит объект.

— Const члены класса: нельзя изменить через объект класса.

— Const методы класса: не меняют члены класса. Часто применяются к getter-методам.
#код
Очередной #дайджест по С++:

✍️ Что в DI-Контейнере твоем, С++? Пробуем написать
Разбор DI-контейнеров на C++.

✍️ Установка OpenCV под Windows
В данной статье описан способ сборки OpenCV из исходников с помощью cmake и Microsoft Visual Studio, и пример запуска своего проекта на cmake.

✍️ Краткий обзор нововведений C++23: deducing this
Документ «deducing this», принятый в последний стандарт C++, вводит новый, третий тип методов классов, сочетающий в себе свойства двух уже существующих: нестатических и статических, открывающий перед нами новые горизонты.

✍️ Регулятор нагрузки
Данный регулятор управляется при помощи arduino и симисторного выхода.

✍️ Компилируем быстрые консольные .exe приложения на PHP 8.1 в 2023 году, а почему бы и нет?
С каждым релизом PHP становится всё быстрее, а при включении JIT (Just-In-Time) компиляции достигает почти отметок того же C.
Сколько лет опыта по вашему должен иметь мидл?
#интерактив
std::tuple

std::tuple — это шаблонный класс, представляющий собой фиксированный набор элементов разных типов. Проще говоря, удобный инструмент для упаковки данных разных типов

Элементы tuple инициализируются в конструкторе и доступны только для чтения после создания.

tuple часто используется в комбинации с tie для присваивания кортежа переменным.
#код
Что такое рефакторинг?

Рефакторинг — это процесс изменения внутренней структуры программы без изменения ее внешнего поведения.

Рефакторинг кода может применяться в следующих ситуациях:

— Улучшение читаемости и понятности кода.
— Оптимизация производительности.
— Устранение дублирования кода.

Рефакторинг особенно важен при работе над большими проектами, где код многократно изменяется и расширяется. Он позволяет поддерживать кодбейз чистым, современным и масштабируемым.
#вопросы_с_собеседований
Паттерн Strategy

Паттерн Strategy — это паттерн проектирования, который позволяет определять семейства связанных алгоритмов и делать их взаимозаменяемыми.
Это дает возможность выбирать конкретный алгоритм во время выполнения программы.

Основная идея паттерна Strategy заключается в том, чтобы вынести алгоритмы в отдельные классы-стратегии и передавать нужную стратегию в клиентский код.

Это паттерн используется, когда:
— Нужно использовать разные варианты одного и того же алгоритма в разных ситуациях.
— Нужно легко добавлять новые стратегии, не меняя существующий клиентский код.
— Нужно избавиться от условных операторов, выбирающих алгоритм.
#код
lmdeploy

LMDeploy — это набор инструментов для сжатия, развертывания и обслуживания LLM.

Открыть страницу
Сколько лет опыта по вашему должен иметь синьор?
#интерактив
RCU (Read-Copy-Update)

RCU (Read-Copy-Update) — это механизм синхронизации доступа к данным в многопоточных приложениях. Он позволяет избежать блокировок при чтении данных, делая копию для чтения и обновляя оригинал после того, как все чтения завершены.

RCU особенно полезен, когда чтение данных происходит гораздо чаще, чем запись.

В примере мы сначала берем rcu_read_lock, чтобы защитить чтение foo. В другом потоке происходит модификация foo с помощью rcu_assign_pointer, которая делает копию данных, а оригинал удаляется после synchronize_rcu.
Таким образом чтение в первом потоке происходит без блокировок и избегает конфликтов с изменением данных в другом потоке. RCU гарантирует, что указатель foo будет виден как старое значение в первом потоке.
#код
Очередной #дайджест по С++:

🤖 Circle может стать будущим C++
Один простой трюк, позволяющий освободить творческие способности в эволюции языка C++.

🤖 AgentBench
Комплексный тест для оценки LLM как агентов.

🤖 fuzzing
Учебники, примеры, обсуждения, исследовательские предложения и другие ресурсы, связанные с фаззингом.

🤖 Моделирование трубы в реальном времени
Создание полноценной симуляции.
std::size

std::size — это функция из стандартной библиотеки C++, которая возвращает размер контейнера или массива.

Она определена в заголовочном файле, работает со всеми стандартными контейнерами (vector, deque, list, array и др.) и с массивами всех типов, позволяя получить размер контейнера или массива в runtime.
#код