C++_BE1
407 subscribers
278 photos
1 video
42 files
519 links
Канал по C/C++, полезный и интересный контент для всех уровней.
По вопросам сотрудничества @cyberJohnny
Download Telegram
➡️ Собственный new для класса

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

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

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

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

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

C++ Learning (https://t.me/Learning_pluses) 👩‍💻
➡️ Использование set_new_handler

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

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

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

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

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

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

C++ Learning (https://t.me/Learning_pluses) 👩‍💻
➡️ Инициализация и присваивание

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

• Инициализация означает присвоение значения переменной в момент её создания, а присваивание относится к изменению значения переменной на другое.

// Это инициализация. Хорошая практика —
// инициализировать переменную сразу при её создании.
int i = 0;

// Это присваивание, где начальное значение
// заменяется новым.
i = 10;

• В C++11 переменную можно инициализировать несколькими способами:

int i = {0};
int i{0};
int i(0);

C++ Learning (https://t.me/Learning_pluses) 👩‍💻
➡️ Разделяемые блокировки

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

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

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

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

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

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

C++ Learning (https://t.me/Learning_pluses) 👩‍💻
➡️ Преобразование строк

• Преобразование строки в целое число или наоборот — это обычное явление в повседневном программировании.

• В C++ 11 были введены удобные обертки для этой цели. Например, чтобы преобразовать целое число в строку, можно написать следующее:

#include
int main() {
int ival = 112233;
std::string str = std::to_string(ival);
return 0;
}

• Чтобы преобразовать строку в целое число, можно написать следующий код:

#include
int main() {
std::string num_str = "112233";
int ival = std::stoi(num_str);
long long llval = std::stoll(num_str);
return 0;
}

C++ Learning (https://t.me/Learning_pluses) 👩‍💻
Открытый урок. Аллокаторы в C++: Что делать, если менеджер памяти вас разочаровывает? 🤔

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

Но можете ли вы принимать решение, где и как будет размещен ваш объект? Часто стандартные методы выделения памяти не удовлетворяют узким требованиям конкретной логики.

⚡️Присоединяйтесь к открытому вебинару 8 августа в 20:00 мск! Поговорим, зачем в C++ существуют аллокаторы.

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

➡️ Зарегистрируйтесь сейчас, чтобы не пропустить бесплатный урок: https://clck.ru/3CGAQE

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
➡️ Библиотека str_format и absl::StrFormat()

• Это эффективная, типобезопасная и расширяемая библиотека, поддерживающая весь синтаксис форматирования printf. Почти все преобразования printf можно легко обновить до absl::StrFormat().

• Библиотека str_format позволяет использовать форматирование printf в C++ с типовой безопасностью и расширяемостью, обеспечивая удобное форматирование строк.

🔗 Ссылочка на доку (https://abseil.io/docs/cpp/guides/format)

C++ Learning (https://t.me/Learning_pluses) 👩‍💻
➡️ Infinity Loop

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

• На самом деле это очень полезная вещь, когда нужно «подождать пока что-то не случится»

while(digitalRead(button) ≠ LOW) { ; }

• Этот код ждет, пока кнопка (пин button) не отпустится. Это очень полезная фишка, которую можно использовать для ожидания какого-либо события.

C++ Learning (https://t.me/Learning_pluses) 👩‍💻
➡️ Магия счётчиков

Думаю каждый встречался с циклами. Так вот. Там есть интересная особенность — нужно объявлять счетчик. Это дико бесит начинающих программистов, так что предлагаю такую конструкцию:

int i = 0;
for(i=0; i < n; i++) { //учимся считать }

• Заменять на такую:

for(int i = 0; i < n; i++) { //учимся считать }

• Это удобнее и красивее

👩‍💻
😈1
➡️ Магия byte

Не многие знаю что существует тип переменной byte. Число этого типа может быть в диапазоне от 0 до 255.

👀 А теперь посмотрите насколько это удобно использовать для хранения значений аналоговых входов Просто идеально… Главное в минус не загоняйте число)

🗣 А, и занимает это чудо в 2 раза меньше памяти. За такое вас по головке поглядят.

👩‍💻
➡️ Использование алиасов для длинных типов

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

• Например:
typedef std::vector StrVector;

C++ Learning (https://t.me/Learning_pluses) 👩‍💻
➡️ Использование RAII для Управления Ресурсами в C++

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

Класс FileWrapper:

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

Метод write:

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

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

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

C++ Learning (https://t.me/Learning_pluses) 👩‍💻
➡️ Управление памятью с использованием std::unique_ptr и пользовательских удалителей

Использование std::unique_ptr с пользовательскими удалителями позволяет автоматически управлять жизненным циклом объектов и безопасно освобождать ресурсы.

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

C++ Learning (https://t.me/Learning_pluses) 👩‍💻
➡️ Обнаружение утечек памяти с использованием нестандартного оператора new в C++

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

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

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

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

C++ Learning (https://t.me/Learning_pluses) 👩‍💻