Библиотека 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
加入频道
Очередной #дайджест по С++:

✍️ Глубина кроличьей норы: бинарная граница и ABI C++
Мир С++ многое сокрывает от глаз программиста. Это свойство языка — обоюдоострый меч, который с одной стороны позволяет уменьшить порог входа, но в то же время является препятствием при написании программ, уходящих дальше стандартного примера.

✍️ C++ и космические технологии
О новшестве в мире C++ — операторе "спейсшип" (spaceship aka three-way comparison), он же тройное сравнение.

✍️ Сборка мусора: как это делается в системном программировании
Поговорим об одной из наиболее критичных по производительности программ, которой вы пользуетесь ежедневно: о вашей операционной системе.

✍️ Действительно ли указатели функций и виртуальные функции работают медленно?
Довольно большая статья об оптимизации.
std::conditional_variable

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

std::condition_variable представляет собой механизм, который позволяет одному потоку ждать, пока другой поток выполняет определенные действия, и затем оповещать первый поток о завершении выполнения этих действий. Она используется вместе с std::unique_lock (или другими мьютексами) для ожидания изменения состояния.
#код
Как сравнить целые числа со знаком и без знака в C++20?

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

Читать статью
Вложенные пространства имен (nested namespaces)

Как можно понять из названия, вложенное пространство имен определяется внутри другого пространства имен. Они используются для организации кода, разделения его на логические блоки и предотвращения конфликтов имен.

nested namespaces часто используются в больших проектах, при создании библиотек, а также для версионирования.
#код
Какие есть способы инициализации полей класса?

В C++ есть несколько способов инициализации полей класса:

— Конструктор: в конструкторе класса можно присвоить начальные значения полям.

— Инициализаторы: можно задать начальные значения для полей непосредственно при их объявлении в классе.

— Инициализационный список: позволяет проинициализировать поля до вызова тела конструктора.

— Значения по умолчанию: для базовых типов компилятор сам присвоит значения по умолчанию, если не указано иное.

— Статическая инициализация: для статических полей класса можно задать начальное значение непосредственно при объявлении.

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

В нашем решении метод intToRoman принимает целое число в качестве аргумента и возвращает его римское представление в виде строки.

Внутри метода intToRoman создаются четыре массива строк, которые содержат римские числа для единиц, десятков, сотен и тысяч. Затем создается строка Roman, которая формируется путем конкатенации соответствующих элементов из каждого массива, используя арифметические операции для определения индексов.
#код
🤖 Возможности С++ для микроконтроллеров

Ваш умный холодильник, принтер, колонка и даже дверной звонок контролируются микроконтроллером. А сам код для них пишут, чаще всего, на C/C++.

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

Смотреть видео
Класс std::string

std::string — это фундаментальный класс в языке программирования C++, который представляет собой последовательность символов. Он используется для работы со строками и является частью стандартной библиотеки C++.

Рассмотрим пять основных функций std::string:

length() — возвращает длину строки;
append(str) — добавляет строку str в конец текущей строки;
substr(start, length) — возвращает подстроку, начинающуюся с индекса start и имеющую длину length;
find(str) — ищет первое вхождение строки str в текущей строке и возвращает индекс первого символа этой подстроки;
replace(start, length, str) — заменяет подстроку, начинающуюся с индекса start и имеющую длину length, на строку str.
#код
Очередной #дайджест по С++:

✍️ Детектор Судного дня или как я разработал датчик радиации для Home Assistant
Статья о науке любительского уровня.

✍️ Выполнение UTF-8 в Windows
Статья о том, как обрабатывать кодировку UTF-8 на платформе, которая по-прежнему поддерживает кодировку UTF-16.

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

✍️ userver
Готовый к использованию асинхронный фреймворк C++ с богатым функционалом.

#дайджест
std::sort

std::sort — это функция стандартной библиотеки для сортировки элементов в контейнерах, таких как вектор или список.
Чтобы использовать std::sort, нужно подключить заголовочный файл .

Метод принимает в качестве аргументов итераторы на начало и конец сортируемой последовательности и сортирует элементы в возрастающем порядке по умолчанию.

Для определения порядка сортировки можно указать свой компаратор.
#код
Как можно вызвать функцию C в программе на C++?

С использованием объявления extern "C".
Интеграционные тесты

Интеграционные тесты (Integration Tests) — это тесты, которые проверяют взаимодействие между различными компонентами (модулями, классами, функциями) вашего приложения. Они предназначены для выявления проблем, которые могут возникнуть при интеграции отдельных частей системы, когда они взаимодействуют вместе.

На картинке пример с использованием фреймворка Google Test.
#код
msg_ptr (message pointer)

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

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

Если запустить код из примера, можно увидеть, что данные успешно передаются между потоками через очередь с использованием указателей на сообщения.
#код
Вы используете механическую клавиатуру для печати или мембранную?
#интерактив
Принцип lock-free

Принцип lock-free (без блокировок) в С++ относится к методам многопоточного программирования, которые позволяют избегать использования блокировок (locks) для обеспечения безопасности доступа к данным из нескольких потоков.

Основная идея lock-free программирования заключается в том, чтобы позволить нескольким потокам одновременно работать с общими данными без блокировки выполнения одного или нескольких потоков.

Однако стоит отметить, что написание lock-free кода может быть сложным и требовать более глубокого понимания атомарных операций и алгоритмов.
#код
Обмен значений двух переменных с помощью XOR

Этот метод является быстрым и не требует использования 3-й переменной.
#код
Релиз версии 5.8.1: реализация пожеланий пользователей и исправление недочетов

Пару дней назад мы зафиксировали версию 5.8.1 открытого проекта SObjectizer. В данной статье поговорим о новых возможностях, которые появились в SObjectizer благодаря пожеланиям пользователей, и упомянем исправление не выявленного ранее недочета. Кому интересно, милости прошу под кат.

Читать статью
Перезагрузка оператора индексации

В C++, перезагрузка оператора индексации (operator[]) позволяет вам создавать собственные классы с доступом к элементам, подобным массивам, используя квадратные скобки для доступа к элементам объекта. Вы можете перегрузить оператор operator[] для пользовательского класса, чтобы обеспечить индексированный доступ к его элементам.
#код
Какая разница между calloc и malloc?

Основное различие между функциями calloc и malloc заключается в том, как они инициализируют выделенную память.

malloc просто выделяет указанный объем памяти и возвращает указатель на него. Содержимое выделенной памяти при этом не инициализируется.
calloc, помимо выделения памяти, также инициализирует всю выделенную память нулями. Таким образом после вызова calloc вся выделенная память будет заполнена нулевыми значениями.

Кроме того, в calloc размер выделяемой памяти задается в элементах, а не в байтах. Calloc умножает количество элементов на размер одного элемента, чтобы определить общий размер памяти для выделения.
#вопросы_с_собеседований