C++ Эволюция
2.72K subscribers
296 photos
2 videos
106 links
Обучающий канал по C++
Download Telegram
#вопросы_с_собеседований
Что такое copy elision и когда становится возможным? Какие особенности для разных стандартов?

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

copy elision становится возможной в сценариях, определенных стандартом C++. Соответствующее положение стандарта называется правилом "as-if", которое позволяет компилятору оптимизировать программу до тех пор, пока она производит такое же наблюдаемое поведение, как и исходный код.

-
C++98/03: copy elision не является обязательной, но разрешена в качестве оптимизации. RVO* и NRVO* - обычные оптимизации, выполняемые компиляторами. *(Return Value Optimization, Named Return Value Optimization)
- C++11: Правила copy elision были пересмотрены. RVO и NRVO стали обязательными в некоторых случаях. copy elision также может происходить при выбросе исключений.
- C++17: Правила исключения копирования были еще более смягчены. Именованные переменные могут быть созданы или присвоены без необходимости выполнения операции перемещения. Эта оптимизация называется "mandatory copy elision".
- C++20: Правила исключения копирования остались такими же, как и в C++17.

Важно отметить, что хотя копирование является широко поддерживаемой оптимизацией, оно все еще зависит от реализации компилятором. Компиляторы могут иметь различное поведение или ограничения в отношении copy elision. Поэтому её использование для оптимизации поведения или производительности может быть непереносимым в различных компиляторах или версиях.
#вопросы_с_собеседований
Как подсчитать количество элементов в std::list?

Чтобы подсчитать количество элементов в std::list, можно использовать следующие способы:

1. Вызвать метод size() самого списка. Он вернет количество элементов.
2. Проитерировать список циклом и считать элементы.
3. Воспользоваться алгоритмом std::distance, передав ему начало и конец списка.
4. Применить алгоритм std::count_if с условием, которое всегда истинно.
С 8 марта прекрасных девушек 🌹!
std::atomic_thread_fence

std::atomic_thread_fence — это функция, которая устанавливает порядок синхронизации памяти для не атомарных и расслабленных атомарных доступов, как указано в аргументе order, без связанной атомарной операции.

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

В этом примере два потока выполняют функции write_x_then_y и read_y_then_x:

- write_x_then_y устанавливает значение атомарной переменной x равным 1, затем вызывает std::atomic_thread_fence с аргументом std::memory_order_release и устанавливает значение атомарной переменной y равным 1.

- read_y_then_x считывает значение атомарной переменной y, затем вызывает std::atomic_thread_fence с аргументом std::memory_order_acquire и считывает значение атомарной переменной x.
Как архитектору эффективно работать с принципом инверсии зависимостей

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

Занятие пройдёт 13 марта в 20:00 мск в рамках курса «Архитектура и шаблоны проектирования». Доступна рассрочка на обучение!

👉Пройдите короткий тест прямо сейчас, чтобы посетить бесплатный урок и получить запись.
#вопросы_с_собеседований
Какая разница между std::map и std::unordered_map?

std::map
— это ассоциативный контейнер на основе красно-черного дерева. Элементы хранятся в отсортированном порядке по ключу. Сложность операций O(log N).

std::unordered_map реализован как хеш-таблица. Элементы хранятся в произвольном порядке. В среднем сложность операций O(1).

Основные различия между std::map и std::unordered_map:

— Поиск, вставка и удаление в std::map за O(log N) в худшем случае. В std::unordered_map за O(1) в среднем.
— Итераторы std::map позволяют перебирать элементы в отсортированном порядке. Порядок элементов std::unordered_map произвольный.
— Map поддерживает бинарный поиск lower_bound(), upper_bound(), а unordered_map — нет.
— В unordered_map нельзя использовать указатели в качестве ключей в хеш-таблице. В map можно.
#вопросы_с_собеседований
Что такое атомарная операция?

Атомарная операция — это операция, которая выполняется как одна неделимая инструкция.

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

Атомарность важна в многопоточном программировании — она позволяет избежать гонок данных при обращении разных потоков к общим данным.
spaceship operator

Spaceship operator (<=>) — это оператор сравнения, введенный в C++20.

Преимущества spaceship operator:
— Позволяет создавать типы, которые можно сравнивать с помощью одного оператора вместо нескольких (==, !=, <, > и т. д.).
— Упрощает написание функций сравнения, например std::sort.
— Читабельнее и компактнее кода с традиционными операторами сравнения.
Спецификатор доступа default

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

Если при объявлении члена класса не указан спецификатор (public, private, protected), по умолчанию считается default.

В примере x объявлен без спецификатора доступа, значит его видимость по умолчанию — private. А y явно помечен как public и доступен извне класса.
Таким образом, default позволяет не писать лишний private при объявлении членов класса.
Чем перемещение отличается от копирования в C++?

Узнайте на бесплатном практическом уроке от OTUS, где вы вместе с опытным экспертом разберете:

- синтаксис и подводные камни move-семантики;
- отличие копирования от перемещения;
- когда компилятор может сам, а когда ему нужно подсказать;
- как отличить rvalue от lvalue;
- как избегать лишнего копирования объектов.

Занятие пройдёт 21 марта в 20:00 мск и будет приурочено к старту курса «Специализация C++ Developer». Доступна рассрочка на обучение!

👉 Зарегистрируйтесь прямо сейчас: https://otus.pw/cGAV/

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
#вопросы_с_собеседований
Какая разница между модульными и интеграционными тестами?

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

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

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

После выхода из функции память, выделенная под временный объект, освобождается. И если где-то сохранилась ссылка на этот объект, то при попытке обратиться к нему произойдет ошибка.
Концепт IterToComparable

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

Этот концепт позволяет убедиться, что можно сравнивать объекты, на которые ссылается итератор, с помощью операторов сравнения как <, <=, >, >=.

В примере используется концепт iter_to_comparable для проверки, что итератор по std::vector указывает на сравнимые объекты int. Это позволяет корректно найти минимальный элемент с помощью std::min_element.
Библиотека Folly

Folly — это набор полезных утилит и компонентов с открытым исходным кодом, разработанный Facebook для проектов на C++.

Она не входит в стандартную библиотеку C++, но предлагает широкий спектр функций, облегчающих разработку.

#для_начинающих
Библиотека Range-v3

Библиотека Range-v3 (range-v3) в C++ представляет собой набор инструментов для работы с диапазонами элементов.

Диапазон — это обобщенное понятие, которое охватывает различные коллекции данных, такие как массивы, вектора, списки и строки.

#для_продвинутых
Хотите с нуля освоить разработку игр или сменить сферу на геймдев?

Отус приглашает 27 марта в 20:00 по мск на бесплатный вебинар по Unreal «Создаём шутер от первого лица на Unreal Engine 5»!

Вебинар является частью полноценного онлайн-курса «Unreal Engine Game Developer. Basic».

На вебинаре вы узнаете об отличиях и преимуществах движка Unreal Engine 5, установите его и научитесь базово ориентироваться в его интерфейсе.

➡️ Регистрация на вебинар: https://clck.ru/39c2mt

Основные темы вебинара:
💪 Что такое игровой движок
💪 Основные отличия и преимущества Unreal Engine 5
💪 Установка и настройка Unreal Engine 5
💪 Подбор ассетов из маркетплейса
💪 Создание проекта

Не упустите свою возможность, попробовать себя в роли разработчика игр на Unreal Engine!

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

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Spdlog

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

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

#для_продвинутых
Ровно год назад автор каналa Торговый Инсайдер дал 4 монеты своим подписчикам и вложил вместе с ними по 100$ в каждую, а теперь пришло время подводить итоги.

Apex 100$ - 11.100$
CDX 100$ - 10.000$
PIXEL 100$ - 3828$
VEIL 100$ - 7.460$

И это всего лишь 4 монеты из огромного количества, которые мы разбирали на канале «Торговый Инсайдер»

9 апреля мы выложим новый список монет на 2024 год.
Поспеши узнать и зайти закупиться пока монеты не улетели в космос!

P.s кто не успел, тот опоздал извиняйте 🤷‍♂️👇🏼
+jtdMrubMBy0xM2E6
Устал писать тесты с кучей моков? Сложно поддерживать приложение, ведь бизнес логика перемешалась с инфраструктурой? 😰

Присоединяйся к нашему практическому курсу по Domain Driven Design, где за 10 вебинаров мы разложим все по полочкам.

🚀Стартуем 1 апреля. Присоединяйся прямо сейчас https://microarch.ru/courses/hexagonal-architecture?utm_source=posev&utm_medium=erid:2VtzqwtV8Fo&utm_campaign=8

Наш курс по Domain-Driven Design позволит вам изучить основы и принципы этого подхода, а также освоить практические навыки, необходимые для успешного применения DDD в реальных проектах. Вы узнаете:
Что такое Domain-Driven Design и почему он так важен для современных разработчиков.
Основы проектирования доменов и формирование предметной области.
Принципы и методы моделирования предметной области, включая разработку моделей предметной области и определение бизнес-правил.
Создание эффективных и масштабируемых сервисов с использованием DDD.
Применение шаблонов проектирования и принципов DDD для оптимиз...