C++ Эволюция
2.72K subscribers
296 photos
2 videos
106 links
Обучающий канал по C++
Download Telegram
Вопрос на собеседовании

Как работает RVO (Return Value Optimization) в C++, и в каких случаях оно не применяется?

Ответ ⬇️
RVO — это оптимизация, при которой компилятор устраняет временные объекты, возвращаемые из функции, что значительно снижает накладные расходы на создание копий. Однако, есть ситуации, когда RVO не применяется, например, при возврате различных объектов в зависимости от условий внутри функции.

🗣 Пример:
#include <iostream>

struct MyObject {
MyObject() { std::cout << "Создан объект\n"; }
MyObject(const MyObject&) { std::cout << "Скопирован объект\n"; }
MyObject(MyObject&&) { std::cout << "Перемещён объект\n"; }
};

MyObject createObject(bool flag) {
if (flag) {
return MyObject(); // RVO применяется
} else {
MyObject obj;
return obj; // RVO может не применяться
}
}

int main() {
MyObject obj1 = createObject(true);
MyObject obj2 = createObject(false);
}


C++ Learning 👩‍💻
➡️ Использование std::barrier для синхронизации потоков

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

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

C++ Learning 👩‍💻
➡️ Использование библиотеки async_simple для работы с асинхронностью в C++

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

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

🔗 Ссылочка на доку

C++ Learning 👩‍💻
➡️ Использование библиотеки cppcoro для работы с корутинами в C++

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

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

🔗 Ссылочка на доку

C++ Learning 👩‍💻
Вопрос на собеседовании

Как работает Rule of Five в C++ и когда его следует применять?

Ответ ⬇️
Rule of Five говорит о том, что если ваш класс управляет ресурсами, вам нужно явно определить пять специальных методов: конструктор копирования, оператор присваивания копированием, конструктор перемещения, оператор присваивания перемещением и деструктор. Это важно, чтобы избежать утечек ресурсов или неправильного управления памятью при копировании или перемещении объектов.

C++ Learning 👩‍💻
Что будет выведено при выполнении кода?

C++ Learning
👩‍💻
Главная конференция по бизнесу в Telegram

31 октября в Москве пройдёт первая конференция по Telegram от крупнейшего сервиса аналитики Telemetr. Топы Телеграм-рынка, маркетологи и представители бизнеса обсудят самые актуальные тенденции и перспективы развития платформы Telegram.

Присоединиться к мероприятию можно будет и онлайн. Тут найдёте всю информацию - https://telemetr.pro.

На конференции вас ждут:
- 20+ опытных спикеров
- 1000+ онлайн и офлайн участников
- две сцены
- нетворкинг активности
- лаунж зона
- вкусный фуршет
- яркое afterparty в PAPA Moscow

Спикерами главной сцены будут: Артемий Лебедев, руководитель Telemetr - Денис Ларионов, основатель агентства GoDigital - Сурен Альбертян, основатель Сидорин ЛАБ - Дмитрий Сидорин и многие другие!

За подробностями сюда - https://telemetr.pro

А купить билет со скидкой в 10% можно, использовав наш промокод - TMConf10

Купить билет - https://telemetr.pro
➡️ Использование std::flat_map для оптимизации производительности

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

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

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

C++ Learning 👩‍💻
➡️ Использование std::latch для синхронизации потоков

std::latch — это примитив синхронизации, который позволяет одному или нескольким потокам ожидать, пока другие потоки не завершат выполнение. В отличие от std::barrier, он не перезагружается после достижения условия синхронизации, что делает его полезным для одноразовой координации.

• std::latch полезен в ситуациях, когда необходимо, чтобы один поток ждал завершения других потоков.

C++ Learning 👩‍💻
➡️ Использование библиотеки cista для сериализации данных в C++

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

cista — отличный выбор для разработчиков, которым нужна эффективная сериализация больших объемов данных без лишней сложности.

🔗 Ссылочка на доку

C++ Learning 👩‍💻
Вопрос на собеседовании

Что такое "SFINAE" (Substitution Failure Is Not An Error) в C++, и как он применяется в шаблонном программировании?

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

Пример использования ⚙️
#include <iostream>
#include <type_traits>

// Шаблон для типов, поддерживающих операцию сложения
template <typename T>
typename std::enable_if<std::is_arithmetic<T>::value, T>::type
add(T a, T b) {
return a + b;
}

// Шаблон для других типов (например, строк)
template <typename T>
typename std::enable_if<!std::is_arithmetic<T>::value, void>::type
add(T a, T b) {
std::cout << "Сложение недоступно для этого типа.\n";
}

int main() {
std::cout << add(5, 3) << std::endl; // Сложение чисел
add(std::string("Hello"), std::string("World")); // Строки не поддерживают сложение
return 0;
}

SFINAE позволяет выбирать реализацию функции add() в зависимости от типа аргументов: для числовых типов выполняется сложение, а для других типов выводится сообщение.


C++ Learning 👩‍💻
➡️ Использование библиотеки di для создания зависимостей в C++

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

di поддерживает автоматическое создание зависимостей и упрощает управление компонентами в сложных проектах.

🔗 Ссылочка на доку

C++ Learning 👩‍💻
Что будет выведено при выполнении кода?

C++ Learning
👩‍💻
⚙️ std::rename()

В C++ функция std::rename() из заголовка <cstdio> используется для переименования файла или перемещения его в новую директорию. Это стандартный способ работы с файлами на уровне ОС.

C++ Learning 👩‍💻
Что будет выведено при выполнении кода?

C++ Learning
👩‍💻
➡️ Использование библиотеки Glaze для сериализации данных в C++

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

Glaze подходит для приложений, где важна производительность при работе с большими объемами данных и их передачей в различные форматы.

🔗 Ссылочка на доку

C++ Learning 👩‍💻
⚙️ std::any_of

В C++ функция std::any_of из <algorithm> проверяет, удовлетворяет ли хотя бы один элемент условию. Полезно для поиска значений, соответствующих критерию.

C++ Learning 👩‍💻
👩‍💻 Задача по C++

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

Пример:

std::vector<int> arr1 = {1, 3, 3, 6, 7, 8, 9};
std::vector<int> arr2 = {1, 2, 3, 4, 5, 6, 8, 9};

std::cout << findMedian(arr1) << std::endl; // Вернёт 6
std::cout << findMedian(arr2) << std::endl; // Вернёт 4.5


Решение задачи на картинке

C++ Learning 👩‍💻
Что будет выведено при выполнении кода?

Пояснение ⬇️
Указатель p указывает на второй элемент массива, и *(p + 2) обращается к четвертому элементу, что равно 4.

C++ Learning
👩‍💻