C++ Эволюция
2.72K subscribers
296 photos
2 videos
106 links
Обучающий канал по C++
Download Telegram
➡️ Индексирование массива (Оператор подиндексации) является коммутативным

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

int arr[] = {1, 2, 3, 4};   
std::cout << arr[1] << std::endl;
std::cout << 1[arr] << std::endl;

for (int i = 0; i < 4; ++i)
std::cout << i[arr] << std::endl;


Это происходит потому, что выражение array[index] эквивалентно *(array + index), что в свою очередь то же самое, что *(index + array), что переводится обратно в index[array].

C++ Learning 👩‍💻
➡️ Собственный new для класса

Оператор new в классе Widget должен работать так:

Установить глобальный обработчик для new через set_new_handler, указав функцию из класса Widget.

Вызвать глобальный operator new. Если он не справится, сработает обработчик Widget.

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

Если память выделена успешно, вернуть указатель и восстановить предыдущий обработчик new.

C++ Learning 👩‍💻
➡️ Использование set_new_handler

Обработчик оператора new циклически ищет память.

Можно зарезервировать и освободить память при первом вызове.

Можно установить или удалить другой обработчик.

Нулевой указатель через set_new_handler вызывает исключение сразу.

В обработчике new можно вызвать исключение bad_alloc или завершить программу с помощью abort или exit.

Для конкретного типа объектов можно задать свои set_new_handler и operator new.

C++ Learning 👩‍💻
📊 @finadviz — Ваш Гид в Мире Финансов! 📊

Ищете глубокие обзоры и инсайты о финансах, рынках и экономике? Финэдвайz — это то, что вам нужно! 🌟

🔍 Экспертные обзоры:
Получайте качественные аналитические материалы от финансовых экспертов.

📈 Инсайты рынка:
Оперативная информация и прогнозы, которые помогут вам принимать обоснованные решения.

🌐 Широкий спектр тем:
От личных финансов до глобальных экономических трендов.

Подпишитесь на Финэдвайz и будьте на шаг впереди! 📉📊
➡️ Правильный менеджер памяти

Создать эффективный менеджер памяти сложно из-за множества нюансов.

Часто игнорируются переносимость, выравнивание и безопасность.

Рассмотрите готовые решения, такие как коммерческие продукты или open source проекты, например, библиотеку Pool из Boost.

Современные компиляторы могут отлаживать функции управления памятью.

C++ Learning 👩‍💻
Злой Банкстер – твой гид в мире финансов. Новости, аналитика, лайфхаки – всё, чтобы ты принимал взвешенные решения и богател!

Подписывайся — @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 👩‍💻