seniorcpp | Unsorted

Telegram-канал seniorcpp - Senior C++ Developer

13626

Изучаем C++. По вопросам сотрудничества: @adv_and_pr

Subscribe to a channel

Senior C++ Developer

Pcap

Pcap - это библиотека для захвата и анализа сетевого трафика.

Она используется для:
- Сниффинга сети;
- Анализа протоколов;
- Отладки сетевых приложений.

Код из примера открывает устройство для захвата пакетов, в цикле считывает пакеты и выводит их длину.

Читать полностью…

Senior C++ Developer

for-each циклы

Цикл for-each - это удобный способ перебрать все элементы контейнера (массива, вектора и т. д.). Синтаксис:

for (type element : container) {
  // тело цикла
}


Цикл последовательно проходит по всем элементам контейнера и записывает каждый в переменную element.

#это_база

Читать полностью…

Senior C++ Developer

👀 Изучать алгоритмы и структуры данных лучше всего на примерах и практике.

Именно такой подход ждет вас в новом потоке онлайн-курса «Алгоритмы и структуры данных» в OTUS.

🎙 На интерактивных вебинарах преподаватели-практики продемонстрируют, как работает каждый алгоритм, и напишут его с нуля с вами прямо на уроке.

Хотите проверить походит ли вам курс?
👉 Пройдите тест и узнайте - https://otus.pw/AaMu/

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

🚀Стартуем 31 июля.

➡️ Оставьте заявку, чтобы занять место в группе со скидкой: https://otus.pw/yPEX/

Нативная интеграция. Информация о продукте www.otus.ru

Читать полностью…

Senior C++ Developer

RCU (Read-Copy-Update)

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

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

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

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Что такое aliasing?

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

Примеры ситуаций, которые могут вызывать aliasing:

- Использование указателей или ссылок, указывающих на один и тот же объект.

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

- Возврат ссылки или указателя из функции на локальный объект.

- Использование union для хранения разных типов данных.

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

Читать полностью…

Senior C++ Developer

Глубокое копирование

Термин глубокое копирование подразумевает создание нового объекта и копирование всех значений полей исходного объекта в новый объект. Если поле является указателем, то вместо копирования самого указателя создается новый объект, на который указывает исходный указатель, и новый указатель на этот новый объект сохраняется в новом объекте.

Это отличается от поверхностного копирования, при котором копируются только значения полей, включая указатели, но не объекты, на которые они указывают.

В этом примере у нас есть класс Deep, который содержит указатель data. В копирующем конструкторе мы создаем новый объект Deep, копируя значение, на которое указывает data в исходном объекте, а не сам указатель.
В функции main мы создаем объект obj1 и затем создаем obj2, используя копирующий конструктор. Затем мы меняем значение, на которое указывает data в obj2, и это не влияет на obj1, что подтверждает, что было выполнено глубокое копирование.

Читать полностью…

Senior C++ Developer

Заполняем вектор последовательными значениями

С этим нам поможет функция std::iota, которая является частью библиотеки <numeric>. Она используется для заполнения диапазона последовательными значениями, начиная с определенного значения.

В этом примере мы создаем вектор из 10 элементов, заполняем его значениями от 1 до 10 с помощью std::iota и выводим вектор.

Читать полностью…

Senior C++ Developer

Синхронизация между стандартными потоками C++ и C

Функция std::ios::sync_with_stdio используется для установки синхронизации между стандартными потоками C++ и стандартными потоками C.

По умолчанию, эта синхронизация включена, это означает, что потоки C++ и C могут быть использованы вместе, и их буферы будут иметь правильный порядок.
Вызов std::ios::sync_with_stdio(false) может увеличить производительность ввода/вывода, но после этого стандартные потоки C++ и C не должны использоваться вместе.

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

Здесь мы также отвязываем std::cin от std::cout, что дополнительно увеличивает скорость ввода/вывода и используем \n вместо std::endl, т. к. std::endl выполняет отчиску буфера и может замедлить вывод.

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Что такое internal linkage?

internal linkage (внутреннее связывание) означает, что имя (например, переменная или функция) видимо и доступно только в пределах файла (или, точнее, в пределах трансляционной единицы), в котором оно определено. Это означает, что если у вас есть два разных файла с исходным кодом, и в каждом из них определено имя с внутренней связью, то эти два имени считаются разными и не конфликтуют друг с другом.

Внутреннюю связь в C++ можно установить несколькими способами. Например, если вы определите переменную или функцию как static, она будет иметь внутреннюю связь. Также, имена в безымянных пространствах имен (anonymous namespaces) имеют внутреннюю связь.

Читать полностью…

Senior C++ Developer

Template Method

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

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

В этом примере AbstractClass определяет шаблонный метод TemplateMethod(), который состоит из вызовов различных операций в определенной последовательности. Некоторые из этих операций делегируются подклассам ConcreteClass1 и ConcreteClass2.

Читать полностью…

Senior C++ Developer

Aggregate initialization

Aggregate initialization — это форма инициализации, которая позволяет инициализировать агрегаты (объекты определенных типов) с использованием фигурных скобок и списка значений. Агрегаты могут быть одним из следующих типов:

- Массивы
- Структуры или классы без пользовательских конструкторов, без закрытых или защищенных нестатических членов данных, без базовых классов и без виртуальных функций.

В этом примере мы создаем структуру Point, которая содержит два целочисленных поля x и y. Затем мы инициализируем объект p1 этой структуры с помощью aggregate initialization, указывая значения для x и y в фигурных скобках. Аналогично, мы инициализируем массив arr с помощью списка значений в фигурных скобках.

Читать полностью…

Senior C++ Developer

cereal

Библиотека cereal для C++ — это гибкая и эффективная библиотека для сериализации, которая поддерживает множество форматов, включая бинарные, XML и JSON. Она может быть использована в различных областях, где требуется сохранение и восстановление состояния объектов.

В этом примере мы создаем структуру MyData и сохраняем ее состояние в файле с помощью cereal::BinaryOutputArchive. Затем мы восстанавливаем структуру из этого файла с помощью cereal::BinaryInputArchive. В конце мы выводим значения полей m2, чтобы убедиться, что состояние было правильно восстановлено.

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Что такое cache miss и как это выявить?

Cache miss — это событие, когда система или приложение делает запрос на получение данных из кэша, но эти данные в данный момент отсутствуют в кэш-памяти. В результате системе или приложению приходится делать вторую попытку найти данные, на этот раз в более медленной основной базе данных.

Чтобы выявить cache miss в C++, вы можете использовать инструменты профилирования, которые могут анализировать события, связанные с кэшем. Некоторые из таких инструментов включают:

Cachegrind: инструмент для профилирования кэша, который является частью набора инструментов Valgrind. Cachegrind может анализировать поведение кэша вашего приложения и предоставлять информацию о cache miss и других событиях, связанных с кэшем.
Perf: инструмент для профилирования производительности в Linux, который может использовать аппаратные счетчики процессора для анализа событий, связанных с кэшем.
OProfile: еще один инструмент для профилирования производительности в Linux, который также может использовать аппаратные счетчики процессора для анализа событий, связанных с кэшем.

Читать полностью…

Senior C++ Developer

Ключевое слово friend

friend в C++ используется для предоставления доступа к закрытым (private) и защищенным (protected) членам класса другим классам или функциям. Это позволяет создавать более гибкие и тесные взаимодействия между классами или функциями, не нарушая инкапсуляцию.

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

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

Читать полностью…

Senior C++ Developer

std::runtime_error

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

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

В данном случае, переменная b равна нулю, поэтому при вызове функции divide будет выброшено исключение. В блоке catch мы перехватываем исключение и выводим сообщение об ошибке.

Читать полностью…

Senior C++ Developer

Защищаем свои данные, деаноним по номеру телефона, атакуем мошеннические сайты. Хочешь также?

Присоединяйся к команде Hack Proof

— У нас ты научишься получать доступ к соседскому WI-FI.

— Узнаешь, как использовать инструменты с github для деанона и взлома.

— Станешь гением социальной инженерии и анонимности в Интернете.

Hack Proof — сообщество чемпионов

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Что такое функторы?

Функторы - это объекты классов, которые могут вызываться как функции.
Другими словами, функторы позволяют обращаться к объекту так, как если бы это была обычная функция.

Функторы полезны в следующих ситуациях:

- Позволяют инкапсулировать функциональность в классе, связывать ее с состоянием объекта.

- Дают возможность передавать объекты-функторы в функции и хранить их в структурах данных.

- Упрощают написание обобщенных алгоритмов, которым нужно выполнять некоторую функциональность, не завися от конкретных типов объектов.

- Используются в стандартной библиотеке C++, например при работе с потоками, для запуска функций в потоке.

Читать полностью…

Senior C++ Developer

Libpq

Libpq - это библиотека, которая предоставляет API для взаимодействия с СУБД PostgreSQL из приложений на С++.
Она используется, когда нужно подключиться к базе данных PostgreSQL и выполнять SQL-запросы из кода на C++.

Этот код подключается к БД PostgreSQL, выполняет запрос к таблице employees и выводит количество строк и столбцов в результате.

Читать полностью…

Senior C++ Developer

⚡️Скорость разработки ПО падает по мере роста размера проекта. Инструменты разработки не могут изменить тенденции, а лишь замедлить и отсрочить неизбежное. SOLID является одной из практик, которая гарантирует неизменность скорости разработки.

Узнайте больше про SOLID-принципы на бесплатном вебинаре онлайн-курса «Архитектура и шаблоны проектирования» в Отус — «SOLID как условие постоянной скорости разработки»: регистрация

На бесплатном занятии мы:
— разберем, почему SOLID принципы являются достаточным условием сохранения скорости разработки;
— рассмотрим простой и понятный механизм их применения для получения повторно используемого кода.

🔥Экспертизой поделится Евгений Тюменцев — опытный директор компании по разработке программного обеспечения.

Нативная интеграция. Информация о продукте www.otus.ru

Читать полностью…

Senior C++ Developer

std::tie

std::tie — это функция, которая создает кортеж ссылок на lvalue из своих аргументов или экземпляров std::ignore.

Она может использоваться для распаковки кортежей или пары значений в отдельные переменные. Например, если у вас есть функция, которая возвращает std::pair или std::tuple, вы можете использовать std::tie, чтобы присвоить значения этого кортежа отдельным переменным.

В этом примере мы используем std::tie для распаковки результата вызова set_of_s.insert(value) в две переменные: итератор iter и логическую переменную inserted.
Это позволяет нам проверить, было ли значение успешно вставлено в набор.

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Можно ли выбрасывать exception из конструктора? Какие поля будут сконструированы, какие поля будут разрушены?

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

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

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

Читать полностью…

Senior C++ Developer

🔥 Тест для разработчиков, тимлидов и архитекторов!🔥

Ответьте на 11 вопросов и узнайте, достаточно ли у вас знаний, чтобы пройти онлайн-курс «Software Architect» в OTUS.
Курс поможет прокачать весь арсенал навыков, необходимых архитектору ПО. 

👉 ПРОЙТИ ТЕСТ https://otus.pw/o0oO/

💣 Пройдете тест и получите:
✔️ Живое общение с экспертами-практиками
✔️ Лучшие открытые уроки прошлых наборов курса
✔️ Продвинутые темы и практика на «боевых» задачах уровня Middle+
✔️ Скидку на прохождение онлайн курса «Software Architect».

Курс доступен в рассрочку.

Нативная интеграция. Информация о продукте www.otus.ru

Читать полностью…

Senior C++ Developer

Флаг компиляции -fPIC

-fPIC используется для генерации позиционно-независимого кода (Position Independent Code, PIC).
Это означает, что сгенерированный код может быть исполнен независимо от его абсолютного адреса в памяти.

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

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

Читать полностью…

Senior C++ Developer

Бесплатный курс по облачным технологиям от экспертов Cloud․ru

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

Ответ на этот вопрос вы найдете на вебинаре облачного провайдера Cloud․ru, где в прямом эфире эксперты компании расскажут, как обучение на новом курсе поможет легко и быстро разобраться в многообразии IaaS- и PaaS-сервисов.

⚡С помощью курса «Быстрый старт в Cloud․ru Advanced» вы получите навыки управления проектами в облаке, а также научитесь настраивать сети, правильно хранить данные и разворачивать виртуальные машины.

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

🎁 Кстати, первых трех поступивших на курс ждет подарок, а какой именно — вы узнаете в эфире.

Зарегистрироваться

Читать полностью…

Senior C++ Developer

Сырые указатели

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

В этом примере p — это сырой указатель на переменную x. Мы можем получить значение x через указатель, используя оператор разыменования *, и мы можем изменить значение x через указатель. Вывод программы показывает, что значение x действительно изменяется через указатель.

Однако использование сырых указателей может быть опасным, поскольку они могут привести к ошибкам, таким как утечки памяти, разыменование нулевого указателя и разыменование висячего указателя. По этой причине в современном C++ рекомендуется использовать умные указатели, такие как std::unique_ptr, std::shared_ptr и std::weak_ptr, которые автоматически управляют жизненным циклом объектов.

Читать полностью…

Senior C++ Developer

Uniform initialization

Uniform initialization — это способ инициализации переменных и объектов, который был введен в стандарте C++11. Он представляет собой универсальный и более предсказуемый способ инициализации, который использует фигурные скобки {} вместо круглых () или присваивания =.

Преимущества uniform initialization включают:
- Предотвращает узкое преобразование (narrowing conversion), которое может привести к потере данных.
- Обеспечивает одинаковый синтаксис для инициализации всех типов данных и структур.
- Позволяет инициализировать объекты, которые ранее не могли быть инициализированы, такие как массивы и структуры.

*Важно отметить, что uniform initialization не всегда работает так, как ожидается, особенно в случае с перегруженными конструкторами. В некоторых случаях, компилятор может выбрать не тот конструктор, который вы ожидали, что может привести к неожиданному поведению.

Читать полностью…

Senior C++ Developer

Boost.Serialization

Boost.Serialization — это часть обширной библиотеки Boost и предоставляет мощные возможности для сериализации и десериализации объектов. Она поддерживает большинство типов данных C++, включая пользовательские типы, и может сериализовать данные в различные форматы, включая двоичный, текстовый и XML.

Boost.Serialization может использоваться для сохранения состояния программы, передачи данных между процессами и постоянного хранения данных.

В этом примере мы создаем объект MyClass с именем obj1 и сохраняем его состояние в файле с помощью boost::archive::text_oarchive. Затем мы восстанавливаем объект obj2 из этого файла с помощью boost::archive::text_iarchive. В конце мы выводим значения полей obj2, чтобы убедиться, что состояние было правильно восстановлено.

Читать полностью…

Senior C++ Developer

std::atomic

std::atomic является частью библиотеки <atomic>, которая была введена в C++11 для поддержки операций с атомарностью. Атомарные операции гарантируют, что операции будут выполнены как единое, неделимое действие, что особенно важно в многопоточном программировании, чтобы избежать состояний гонки.

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

В этом примере у нас есть глобальная переменная counter, которую мы хотим инкрементировать в двух разных потоках. Без использования std::atomic мы могли бы столкнуться с состоянием гонки (race condition), когда оба потока пытаются обновить counter одновременно. Однако, поскольку мы используем std::atomic<int>, каждое обновление counter является атомарной операцией, и состояние гонки не происходит.

Читать полностью…

Senior C++ Developer

Алгоритм random_shuffle

Он случайным образом переставляет элементы в диапазоне [первый, последний).

Алгоритм меняет значение каждого элемента на какой-либо другой случайно выбранный элемент.

Про различия между shuffle и random_shuffle можно почитать здесь.

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Как запретить наследовать класс?

Чтобы запретить наследование класса в C++, вы можете объявить класс как final.

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

class Base final {
// ...
};

class Derived : public Base {
// ...
};
// Ошибка компиляции: класс Base объявлен как final

Читать полностью…
Subscribe to a channel