C++ Эволюция
2.72K subscribers
296 photos
2 videos
106 links
Обучающий канал по C++
Download Telegram
Злой Банкстер – твой гид в мире финансов. Новости, аналитика, лайфхаки – всё, чтобы ты принимал взвешенные решения и богател!

Подписывайся — @Zloy_Bankster 👍
➡️ Разделяемые блокировки

Разделяемые блокировки полезны, когда:

Блокировка удерживается долго.
Несколько читателей могут одновременно её захватывать.

Схема разделяемой блокировки может быть эффективной, если:

Блокировка удерживается длительное время, например, при работе с большим контейнером.

Основной вопрос:

Не "пишу ли я в данные", а "как долго блокировка будет удерживаться читателями по сравнению с временем её захвата?"

C++ Learning 👩‍💻
😈 Злой Рекламщик – канал про маркетинг без розовых очков.

🔥 Разбираем кейсы, которые работают.
🔥 Делимся фишками, о которых не расскажут другие.
🔥 Режем правду-матку про digital и медиа.

Подпишись, если не боишься правды: @zloy_reklamshik
➡️ Разделяемые блокировки

Разделяемые блокировки полезны, когда:

Блокировка удерживается долго.
Несколько читателей могут одновременно её захватывать.

Схема разделяемой блокировки может быть эффективной, если:

Блокировка удерживается длительное время, например, при работе с большим контейнером.

Основной вопрос:

Не "пишу ли я в данные", а "как долго блокировка будет удерживаться читателями по сравнению с временем её захвата?"

C++ Learning 👩‍💻
## 🤫 Псс, хочешь знать секреты московской недвижимости?

🔥 Инсайды от экспертов, о которых не пишут в газетах - только в канале "Квадратные инсайды"!

💰 Будь на шаг впереди:
   * Узнай, где ждать роста цен
   * Получи эксклюзивные предложения
   * Не упусти выгодную сделку

👉 Подписывайся и получай преимущество: @kvadrat_insides
➡️ Использование алиасов для длинных типов

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

Например:
typedef std::vector<std::string> StrVector;


C++ Learning 👩‍💻
📢 Открытые Финансы с @BanklessNews: Независимые Новости Без Пропаганды и Спекуляций 📢

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

🔍 Представляем вам Bankless — ваш надежный спутник в мире независимых финансовых новостей! 🌐

Что делает Bankless особенным среди множества финансовых каналов? 🤔

Независимость: Мы не связаны с крупными корпорациями или политическими интересами. Наша миссия — предоставлять вам честную и объективную информацию.

Четкие Новости: Здесь нет места пропаганде и спекуляциям. Только факты, только проверенная информация, позволяющая вам принимать обоснованные финансовые решения.

Актуальность: Мы оперативно освещаем самые важные события в мире финансов, обеспечивая вас всеми необходимыми сведениями для того, чтобы оставаться на шаг впереди.

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

📈 Bankless — это ваш компас в бурном море финансового мира. Присоединяйтесь к нашему сообществу, чтобы всегда быть в курсе самых значимых новостей и не упускать ни одной важной детали!

👉 Подпишитесь на @BanklessNews, и пусть ваши финансовые решения будут обоснованными и уверенными. Включайте знание, отключайте страх!

Будьте в курсе самых свежих финансовых новостей с Bankless!
➡️ Использование RAII для Управления Ресурсами в C++

RAII (Resource Acquisition Is Initialization) — это идиома в C++, которая обеспечивает автоматическое управление ресурсами. Она гарантирует, что ресурсы будут освобождены, когда объект, владеющий ими, выходит из области видимости.

Класс FileWrapper:

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

Метод write:

Проверяет, открыт ли файл, и записывает сообщение в файл, если файл открыт.

Использование в main:

Объект FileWrapper создается в блоке try, и файл автоматически закрывается, когда объект выходит из области видимости.
Исключения обрабатываются в блоке catch, выводя сообщение об ошибке.

C++ Learning 👩‍💻
➡️ Использование CRTP (Curiously Recurring Template Pattern) для создания статического полиморфизма в C++

CRTP (Curiously Recurring Template Pattern) — это идиома в C++, которая позволяет создавать статический полиморфизм, избегая накладных расходов виртуальных функций. Этот шаблон часто используется для реализации интерфейсов, которые компилируются во время компиляции.

Базовый класс шаблона CRTP:

template <typename Derived> class Base определяет базовый класс, который принимает производный класс в качестве параметра шаблона.
Метод interface вызывает метод implementation, который должен быть определен в производном классе, используя static_cast<Derived*>(this) для приведения указателя this к типу производного класса.

Производные классы:

Derived1 и Derived2 наследуют от Base, передавая себя в качестве параметра шаблона.
Оба класса переопределяют метод implementation для предоставления собственной реализации.

Использование CRTP в main:

Создаются экземпляры Derived1 и Derived2.
...
➡️ Динамическое создание объектов с помощью фабричного метода и рефлексии в C++

Создание объектов на основе строковых идентификаторов — мощная техника, позволяющая улучшить гибкость и расширяемость программного кода.

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

C++ Learning 👩‍💻
➡️ Обнаружение утечек памяти с использованием нестандартного оператора new в C++

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

Мы переопределяем оператор new, чтобы отслеживать все выделения памяти, сохраняя указатели и размеры выделенных блоков в std::map.

Переопределение оператора delete позволяет отслеживать освобождение памяти. Когда память освобождается, соответствующая запись удаляется из allocations.

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

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

C++ Learning
👩‍💻
@biz_tochla — ярко о главных новостях бизнеса за 5 минут. Каждый день.
➡️ Ленивая инициализация статического объекта с использованием std::call_once

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

🗣️ Для этого можно использовать std::call_once.

C++ Learning 👩‍💻
➡️ Оператор decltype для создания зависимых типов в C++

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

Оператор decltype определяет тип sum на основе типа элементов, возвращаемых итератором контейнера. Это позволяет избежать жесткого кодирования типов и делает код более гибким.

Использование decltype в шаблонных функциях позволяет писать более универсальный код, который корректно работает с различными типами контейнеров.

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

SFINAE (Substitution Failure Is Not An Error) — это одна из самых мощных и менее известных техник в C++, которая позволяет выбирать, какие функции должны быть скомпилированы, на основе доступности определенных типов или выражений.

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

В примере выше используются std::enable_if_t и std::is_integral_v для выбора функции, которая будет скомпилирована, на основе типа передаваемого аргумента.

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

C++ Learning 👩‍💻
➡️ Сжатие данных с использованием std::vector::shrink_to_fit

std::vector::shrink_to_fit — метод, который позволяет уменьшить емкость вектора до его фактического размера. Это полезно, когда нужно освободить память, занимаемую неиспользуемыми элементами, особенно после значительного сокращения размера вектора.

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

Используйте shrink_to_fit, когда нужно минимизировать использование памяти после удаления большого числа элементов из вектора. Это улучшает производительность и снижает потребление ресурсов, что особенно важно в средах с ограниченной памятью.

C++ Learning 👩‍💻
@infocygan_ru — превращаем маркетинг в магию, а рекламу — в настоящее искусство! Раскрываем секреты влияния, обманки, и классических трюков маркетолога.

Подписывайтесь!
➡️ Оптимизация доступа к элементам через std::deque с использованием индексации

std::deque — это контейнер, который позволяет эффективное добавление и удаление элементов как с начала, так и с конца. В отличие от std::vector, std::deque обеспечивает постоянное время доступа к элементам как в начале, так и в конце контейнера.

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

C++ Learning 👩‍💻
➡️ Оптимизация работы с большими объектами с помощью std::move и семантики перемещения

std::move — это функция, которая превращает объект в "rvalue" (правостороннее значение), позволяя использовать семантику перемещения вместо копирования. Это особенно полезно при работе с большими объектами, где копирование может быть дорогим.

В этом примере используется std::move, чтобы передать большой объект LargeObject в функцию processLargeObject с использованием семантики перемещения. Вместо дорогостоящего копирования большого массива, память просто передается новому объекту, что значительно улучшает производительность.

C++ Learning 👩‍💻
➡️ Boost.MultiIndex — мощная библиотека для работы с контейнерами с множественной индексацией

Boost.MultiIndex — это часть популярной библиотеки Boost, которая предоставляет контейнеры с возможностью множественной индексации данных. Она позволяет хранить элементы в одном контейнере, но доступ к ним может осуществляться по разным критериям. Эта библиотека объединяет функциональность стандартных контейнеров, таких как std::set и std::map, в одном универсальном решении.

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

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

C++ Learning 👩‍💻