Senior C++ Developer
11.6K subscribers
1.49K photos
3 videos
638 links
Изучаем C++.

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

РКН: https://www.gosuslugi.ru/snet/676e9a1e4e740947beca35ba
Download Telegram
#вопросы_с_собеседований
Какие есть особенности работы с shared memory?

Работа с разделяемой памятью (shared memory) предполагает использование операций чтения и записи данных в общую область памяти, которая разделяется между несколькими процессами.

Среди особенностей можно выделить основные:

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

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

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

std::weak_ptr является частью стандартной библиотеки и представляет собой "слабый указатель" на объект, управляемый std::shared_ptr.

Он позволяет получать доступ к объекту, на который ссылается std::shared_ptr, но не влияет на его счётчик ссылок. Такой подход полезен в ситуациях, когда мы хотим избежать возможности утечек памяти из-за циклических ссылок между объектами.

В этом примере мы создаем два объекта типа Node, а затем устанавливаем циклическую ссылку между ними. Если бы мы использовали std::shared_ptr вместо std::weak_ptr для хранения ссылок, объекты node1 и node2 никогда не были бы удалены, поскольку они бы взаимно ссылались друг на друга и счётчики ссылок не достигали бы нуля.

*На втором изображении представлен результат работы кода.
Участвуй в КосмоХакатоне 4–6 сентября, решай реальные космические кейсы, поборись за 1,2 млн ₽ и шанс попасть в финал в Москве!

С 4 по 6 сентября в Ростове-на-Дону пройдёт КосмоХакатон Южного и Северо-Кавказского федеральных округов — масштабное соревнование для тех, кто готов превратить данные о нашей планете в реальные технологические решения.

Один хакатон — два формата: участвовать можно очно в Ростове-на-Дону или онлайн из любой точки России. Все команды работают над едиными кейсами, оцениваются по одинаковым критериям и участвуют в общем рейтинге.

В рамках хакатона также пройдёт открытая лекция «Применение космических технологий для решения экологических задач» от Игоря Кожелина, CEO SR Data.
Призовой фонд — 1 200 000₽

Даты проведения: 4–6 сентября
Формат: онлайн и офлайн
Очная площадка: Центр развития предпринимательства «Новый Ростов», ул. Максима Горького, 151, 4 этаж.
🔗 Зарегистрироваться: https://космохакатон.рф
#вопросы_с_собеседований
Можно ли использовать exceptions в конструкторе / деструкторе?

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

В конструкторе:

- Если конструктор выбрасывает исключение, объект не будет полностью сконструирован, и память, выделенная под него, не будет освобождена автоматически. Это может привести к утечке ресурсов или некорректному состоянию программы. В таких случаях следует использовать RAII (Resource Acquisition Is Initialization), чтобы гарантировать правильное освобождение ресурсов при исключениях.
- Конструкторы должны быть безопасными в отношении исключений. Если конструктор может выбросить исключение, стоит использовать try-catch в самом конструкторе или передать исключение дальше в коде.

В деструкторе:

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

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

Для работы с сокетами в C++ вы можете использовать библиотеку сокетов, такую как BSD Sockets или Boost.Asio.

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

В C++ пайпы (pipes) представляют собой механизм для односторонней связи между процессами.
Они позволяют передавать данные из одного процесса в другой, где один процесс выступает в роли писателя (write end), а другой процесс выступает в роли читателя (read end) пайпа.

Для работы с пайпами вы можете использовать системные вызовы, такие как pipe, fork и функции чтения/записи (read и write), доступные в POSIX-совместимых операционных системах.

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

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

Особенности std::map в сравнении с std::set:

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

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

Некоторые особенности std::set:

- Уникальность элементов: Каждый элемент в std::set является уникальным, в контейнере не может быть несколько одинаковых элементов.

- Сортировка элементов: std::set автоматически сортирует элементы по их значениям при вставке, это позволяет эффективно выполнять операции поиска.

- Динамическое изменение: std::set позволяет добавлять и удалять элементы из контейнера в любое время.
Visitor

Visitor является поведенческим паттерном проектирования, который позволяет добавлять новые операции к классам объектов, не изменяя их структуру
. Он достигается путем выделения операций в отдельный класс-посетитель, который посещает объекты классов и выполняет необходимые операции.

Основная идея паттерна Visitor заключается в том, чтобы объекты классов принимали "посетителя" и передавали себя в качестве аргумента методам "посетителя", соответствующим своему классу. "Посетитель", в свою очередь, реализует различные методы для обработки разных типов объектов.
This media is not supported in your browser
VIEW IN TELEGRAM
Запрограммируй робота на C++ и поборись за призовой фонд трека 7 500 000 руб на True Tech Champ 2026.

Попробуй себя в треке по программированию роботов. Начать проще, чем кажется: зарегистрируйся, собери команду или объединись с другими участниками на платформе и пройди квалификационный этап до 13 сентября. В онлайн-симуляторе тебе предстоит запрограммировать робособаку для доставки груза через полосу препятствий. Количество попыток не ограничено, а еще тебя будет ждать серия обучающих вебинаров.

Лучшие команды пройдут в финал и будут программировать реальных роботов на офлайн-полигоне 22 октября на большой сцене.
Масштабный финал объединит борьбу за призовой фонд, выступления хедлайнеров, доклады спикеров и активности для всех гостей мероприятия.

Рекомендуемые стеки: Go, Java, Python, C#, C++, JS.

Успей зарегистрироваться и пройти квалификацию до 13 сентября.

Erid: 2VSb5z8QrR8
move constructor

Move-конструктор — это специальный конструктор, который позволяет эффективно перемещать ресурсы из одного объекта в другой, без необходимости копирования данных.
Он используется для реализации семантики перемещения (move semantics) и оптимизации работы с временными объектами.

Move-конструктор принимает rvalue ссылку (&&) на объект, который будет перемещен, и выполняет простое копирование указателей на данные, а не их фактическое копирование.

Использование move-конструктора позволяет избежать лишних копирований данных и повысить производительность при работе с большими или ресурсоемкими объектами.
Генерация случайных числе в C++

Чтобы сгенерировать случайное число используется функция rand(), которая размещается в библиотечном файле stdlib.h.

Функция возвращает случайное целочисленное значение, которое лежит в пределах от 0 до 32767.
Алгоритм reverse_copy

Алгоритм копирует элементы из заданного диапазона, но в обратном порядке.

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