Библиотека 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
加入频道
На каком языке вы пишите сейчас и на какой хотели бы перейти?
#интерактив
Алгоритм partial_sort

partial_sort — это алгоритм сортировки из стандартной библиотеки, который упорядочивает только часть контейнера.
Сортирует элементы в диапазоне [first, middle). Элементы справа от middle остаются без изменений.

При работе с частью данных эффективнее полной сортировки. Внутри использует алгоритм quicksort.

Применение:
— Быстрый поиск K наибольших/наименьших элементов.
— Сортировка только части большого массива данных.
— Оптимизация производительности по сравнению с полной сортировкой.
#код
Что такое SIMD-инструкции?

SIMD-инструкции — это специальные команды процессора, которые работают с векторными регистрами и могут выполнять одну операцию над несколькими элементами данных параллельно.

Например, при сложении двух векторов из четырех float чисел вместо четырех инструкций сложения с SIMD можно выполнить одну команду, которая сложит эти вектора за одну операцию.

Основные преимущества SIMD:
— Повышение производительности за счет параллельных вычислений.
— Эффективное использование пропускной способности процессора.
— Уменьшение количества инструкций за счет векторизации.
— Оптимизация алгоритмов обработки массивов, матриц, фильтрации, графики.
#вопросы_с_собеседований
std::conditional_variable

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

Основной метод std::condition_variable — это wait(), который блокирует вызывающий поток до тех пор, пока другой поток не оповестит его с помощью метода notify_one() или notify_all(). Когда вызывается wait(), текущий поток освобождает блокировку, которая должна быть захвачена вместе с вызовом wait(), и ожидает, пока другой поток не вызовет один из методов оповещения. После получения оповещения поток пробуждается и пытается повторно захватить блокировку, и если блокировка успешно захватывается, поток может продолжить свою работу.

В этом примере создается поток workerThread, который ожидает сигнала от основного потока. Основной поток засыпает на 2 секунды, а затем устанавливает флаг ready в true и оповещает ожидающий поток с помощью notify_one(). workerThread пробуждается и выводит сообщение в консоль.
#код
📊 Как я входил в IT? Результаты опроса «Библиотеки программиста»

Вы когда-нибудь задумывались о том, как входят в IT люди, у которых нет технического образования? Насколько тяжело начать карьеру с чистого листа в зрелом возрасте? Вот и мы решили выяснить это.

Читать статью
Что лучше: ООП или функциональный подход?
#интерактив
static_assert

static_assert — это механизм в C++, который позволяет выполнять проверки на этапе компиляции для статических условий. Он был добавлен в стандарт C++11 и предоставляет способ проверки, что определенное условие истинно во время компиляции. Если условие ложно, компиляция завершится ошибкой.
#код
Очередной #дайджест по C++:

✍️ Визуализация алгоритмов стандартной библиотеки C++ (продолжение)
В стандартной библиотеке C++ много разных алгоритмов для работы с контейнерами. С помощью этих алгоритмов можно искать значения, сортировать последовательности, изменять их и делать многое другое.

✍️ Шпаргалка по модели памяти С++11
Модель памяти представляет из себя спецификацию допустимого поведения многопоточных программ, работающих с разделяемой памятью (shared memory).

✍️ Как мы анализируем потребление памяти нативными приложениями (C++, Windows, Linux)
В процессе эксплуатации решений, созданных на платформе 1С:Предприятие, разработчики иногда сталкивались с тем, что в определенных сценариях потребление памяти процессами платформы казалось избыточным.

✍️ Блеск и нищета std::format
Сравнительно недавно в stdlib плюсов появилось форматирование строк «как в питоне», а точнее, как в библиотеке fmt.
decltype

decltype — это ключевое слово, используемое для запроса типа выражения. Оно было введено в C++11 и используется в основном в обобщенном программировании, где часто трудно или даже невозможно определить тип выражения.

Один из примеров использования decltype — это объявление шаблонной функции, тип возвращаемого значения которой зависит от типов аргументов шаблона.

В C++11 можно использовать decltype для конечного возвращаемого типа вместе с ключевым словом auto, чтобы объявить шаблонную функцию, возвращаемый тип которой зависит от типов аргументов шаблона.

В этом примере кода показано, как decltype используется для определения типа выражения. Результат работы этого кода будет зависеть от того, какие значения будут присвоены переменным и какие функции будут вызваны.
#код
μMon: тупой простой мониторинг

Автор представляет μMon – его личный, минималистский и самоуверенный подход к мониторингу хостов, основанный на RRDtool, SNMP, некоторых облегченных сценариях оболочки и небольшом сервере FastCGI, написанном с использованием скромного подмножества современного C++.

Читать статью
ACID (Atomicity, Consistency, Isolation, Durability)

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

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

Consistency гарантирует, что данные в базе будут согласованы с правилами и ограничениями базы данных.

Isolation гарантирует, что транзакции будут выполнены независимо друг от друга и не будут влиять друг на друга.

Durability гарантирует, что данные в базе данных сохранятся даже в случае сбоев или отказа оборудования.
#код
Возможно ли иметь рекурсивную встроенную функцию?

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

Компилятор с хорошим оптимизатором может встраивать рекурсивные вызовы до некоторой глубины, зафиксированной во время компиляции (скажем, три или пять рекурсивных вызовов), и вставлять нерекурсивные вызовы во время компиляции для случаев, когда фактическая глубина будет превышена во время выполнения.
#вопросы_с_собеседований
forward_list

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

Добавление, удаление и перемещение элементов внутри списка или между несколькими списками не инвалидирует итераторы, которые в настоящее время ссылаются на другие элементы в списке. Однако итератор или ссылка, ссылающиеся на элемент, инвалидируются, когда соответствующий элемент удаляется (через erase_after) из списка.

В этом примере мы создаем forward_list с именем numbers, с помощью метода front() получаем первый элемент списка и выводим его на экран. Далее мы перебираем все элементы списка с помощью цикла for и выводим их на экран.
#код
Essence: настольная операционная система, созданная с нуля для обеспечения контроля и простоты. Довольно интересный вариант для тех, кому хочется чего-то нового.

Открыть сайт
🎮 Идеальный подарок геймеру: Xbox vs PlayStation vs Nintendo Switch vs Steam Deck

В продолжение темы предыдущего опроса рассмотрим самые популярные платформы на рынке – Xbox, PlayStation, Nintendo Switch и Steam Deck – и поможем вам определиться с выбором.

🔗Читать статью
🔗Зеркало
Please open Telegram to view this post
VIEW IN TELEGRAM
Очередной дайджест по С++:

Федя, дичь
В мире программирования существует огромное количество багов, и если бы каждый баг стал бабочкой, то программеру в раю уже давно оставлена пара полян для развития навыков энтомолога.

Примечания к OpenMP
Записки по курсу Тима Мэтсона.

Базовое модульное тестирование C++ с помощью GTest, CMake и подмодулей
Повторное использование проектов C++ — достаточно плохой опыт. Когда дело доходит до накладных расходов, вызванных интеграцией с такими вещами, как фреймворки модульного тестирования, кошмар может стать значительно хуже.

Defold — это совершенно бесплатный игровой движок для разработки настольных, мобильных и веб-игр.
Хотите ли вы изучить vim или он вам не нужен?
#интерактив
Применение указателя 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.
#код