Senior C++ Developer – Telegram
Senior C++ Developer
12.1K subscribers
1.38K photos
3 videos
620 links
Изучаем C++.

По вопросам сотрудничества: @adv_and_pr

РКН: https://www.gosuslugi.ru/snet/676e9a1e4e740947beca35ba
Download Telegram
std::unordered_map

std::unordered_map - это контейнерный класс, который предоставляет структуру данных, известную как хэш-карта или хэш-таблица
. Он доступен начиная с C++11.

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

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

- В этом примере мы создаем myMap, которая сопоставляет целые числа со строками.
- С помощью функции insert() вставляются 3 пары ключ-значение.
- Затем мы получаем доступ и печатаем значение, связанное с ключом 2, используя оператор [].
- С помощью функции erase() удаляем значение с ключом 3.
- Далее мы выполняем итерации по карте с помощью цикла for, чтобы вывести все пары ключ-значение.
- Наконец, мы используем функцию find(), чтобы проверить, существует ли ключ 2 в карте.
Вам нравится читать контент на этом канале?

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

Следуйте 3 простым шагам, чтобы сделать это:

1) Нажмите на ссылку: Вход
2) Пополняйтесь удобным способом
3) Размещайте публикацию

Если тематика вашего поста подойдет нашему каналу, мы с удовольствием опубликуем его.
#вопросы_с_собеседований
Что выведет код сверху?

Ответ: “Constructor called” 5 раз и затем “Destructor called” 5 раз.

В приведенной выше программе мы сначала инициировали переменные с пятью указателями, используя ключевое слово new, следовательно, после этого будет вызван конструктор fives time, поскольку мы используем delete[] (используется для удаления нескольких объектов) для удаления переменных, следовательно, все созданные пять объектов будут уничтожены и, следовательно, будет вызван деструктор five times.
Рисуем мультяшный взрыв за 180 строчек голого C++

Смотреть статью
#вопросы_с_собеседований
Какой код выполняется до функции main?

Ответ:
Конструкторы глобальных объектов.
std::async

В C++ std::async - это шаблон функции, предоставляемый стандартной библиотекой <future>. Он используется для асинхронного выполнения функции или вызываемого объекта и получения объекта future, представляющего результат вычислений.

Функция std::async создает новый поток или использует существующий поток из пула потоков реализации для выполнения поставленной задачи. Она возвращает объект std::future, который можно использовать для получения результата или статуса вычисления.

В этом примере функция AddNumbers выполняется асинхронно с использованием std::async. Она принимает два целых числа в качестве аргументов и возвращает их сумму. Функция std::async вызывается с помощью AddNumbers и аргументов 5 и 10.
Функция std::async возвращает объект std::future<int>, который представляет собой результат вычисления. Вызывая функцию get() на объекте future, мы блокируем выполнение до завершения вычислений и получаем результат.
std::conditional_variable

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

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

В этом примере создается поток workerThread, который ожидает сигнала от основного потока. Основной поток засыпает на 2 секунды, а затем устанавливает флаг ready в true и оповещает ожидающий поток с помощью notify_one(). workerThread пробуждается и выводит сообщение в консоль.
#вопросы_с_собеседований
Что такое CI/CD и какие преимущества дает разработчику?

CI/CD означает непрерывную интеграцию и непрерывное развертывание.
Это набор практик и инструментов, используемых в разработке программного обеспечения для автоматизации процесса создания, тестирования и развертывания приложений.

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

Непрерывное развертывание (или Continuous Delivery) направлено на автоматизацию процесса развертывания программного обеспечения в производственных средах. Он включает в себя автоматизацию шагов, необходимых для упаковки, развертывания и настройки приложения.

Вот некоторые преимущества CI/CD для разработчиков C++:

1. Раннее обнаружение ошибок.
2. Более быстрый цикл обратной связи.
3. Качество и ремонтопригодность кода.
4. Сотрудничество и коммуникация между разработчиками.
5. Автоматизация сборки, тестирования и развертывания кода.
6. Непрерывное развертывание.
7. Масштабируемость.
#вопросы_с_собеседований
Что такое барьеры памяти?

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

Существует несколько типов барьеров памяти, которые можно использовать в C++:

- Барьер приобретения: Гарантирует, что последующие операции с памятью не могут быть переупорядочены до барьера.

- Барьер освобождения: Гарантирует, что предшествующие операции с памятью не могут быть переупорядочены после барьера.

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

- Барьер чтения-записи: Гарантирует, что предшествующие операции чтения не могут быть переупорядочены последующими операциями записи.

В C++ барьеры памяти обычно реализуются с помощью атомарных операций или примитивов синхронизации, предоставляемых языком, таких как std::atomic_thread_fence, std::atomic_signal_fence, или мьютексов и переменных состояния.
#вопросы_с_собеседований
Как разработать систему плагинов на С++?

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

1. Определите интерфейс подключаемых модулей: Этот интерфейс должен определять набор функций или классов, которые должны реализовывать подключаемые модули.

2. API для плагинов: Создайте API, который облегчает загрузку и управление подключаемыми модулями.

3. Динамическая загрузка библиотек: Используйте механизм динамической загрузки библиотек операционной системы для загрузки подключаемых модулей во время выполнения.

4. Обнаружение плагинов: Реализуйте механизм для обнаружения и регистрации доступных подключаемых модулей во время выполнения.

5. Жизненный цикл плагина: Определите жизненный цикл плагинов, включая инициализацию, настройку и очистку.

6. Связь с плагинами: Разработайте механизм связи между приложением и подключаемыми модулями. Это может быть достигнуто с помощью вызовов функций, обратных вызовов, систем событий или передачи сообщений, в зависимости от требований вашей системы плагинов.

7. Обработка ошибок: Реализуйте механизмы обработки ошибок для разрешения таких ситуаций, как неудачная загрузка плагина, несовместимые версии плагинов или ошибки времени выполнения плагинов. Это обеспечивает надежность и стабильность системы плагинов.

Стоит отметить, что разработка системы плагинов может быть сложной задачей, и есть существующие фреймворки и библиотеки, которые могут помочь упростить этот процесс. Некоторые популярные варианты в C++ включают Boost.Extension, Poco Foundation и Qt's Plugin System. Эти фреймворки предоставляют абстракции и инструменты для создания систем плагинов и могут сэкономить время и усилия разработчиков.

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

Динамический анализатор кода C++ - это инструмент или программное обеспечение, которое анализирует код C++ во время выполнения или исполнения.
Он выполняет различные проверки и инспекции кода для обнаружения потенциальных проблем, ошибок, утечек памяти, узких мест в производительности или других проблем во время выполнения. В отличие от статического анализа кода, который анализирует код без его выполнения, динамический анализ дает представление о поведении кода во время его выполнения.

Примеры:

Valgrind: Это мощный инструмент динамического анализа, в него входит Memcheck, который обнаруживает утечки памяти, некорректные обращения к памяти и другие ошибки, связанные с памятью.

AddressSanitizer (ASan): Это детектор ошибок памяти, встроенный в компиляторы Clang и GCC. Он обнаруживает такие ошибки памяти, как переполнение буфера, использование после освобождения и т.д. ASan проверяет код во время компиляции, внедряя проверки во время выполнения.

Dr. Memory: Это инструмент отладки памяти для Windows и Linux. Он обнаруживает такие ошибки, как утечки памяти, незаконный доступ к памяти и неинициализированное чтение памяти.

GNU Electric Fence: Это инструмент отладки, который помогает обнаружить переполнения буфера и другие ошибки, связанные с памятью. Он использует технику под названием "защитные страницы" для защиты выделения памяти и обнаружения незаконных обращений.