➡️ Собственный new для класса
Оператор new в классе Widget должен работать так:
• Установить глобальный обработчик для new через set_new_handler, указав функцию из класса Widget.
• Вызвать глобальный operator new. Если он не справится, сработает обработчик Widget.
• Если и это не поможет, глобальный new выбросит исключение. В этом случае обработчик Widget должен восстановить исходный обработчик и передать исключение дальше.
• Если память выделена успешно, вернуть указатель и восстановить предыдущий обработчик new.
C++ Learning (https://t.me/Learning_pluses) 👩💻
Оператор new в классе Widget должен работать так:
• Установить глобальный обработчик для new через set_new_handler, указав функцию из класса Widget.
• Вызвать глобальный operator new. Если он не справится, сработает обработчик Widget.
• Если и это не поможет, глобальный new выбросит исключение. В этом случае обработчик Widget должен восстановить исходный обработчик и передать исключение дальше.
• Если память выделена успешно, вернуть указатель и восстановить предыдущий обработчик new.
C++ Learning (https://t.me/Learning_pluses) 👩💻
Тысяча и одна библиотека С++
https://habr.com/ru/articles/831754/
https://habr.com/ru/articles/831754/
Хабр
Тысяча и одна библиотека С++
В жизни каждого программиста С++ рано или поздно возникает задача, которую кто-либо уже решил. Однако найти это решение бывает очень непросто в силу разных причин: оно недостаточно разрекламировано,...
➡️ Использование set_new_handler
• Обработчик оператора new циклически ищет память.
• Можно зарезервировать и освободить память при первом вызове.
• Можно установить или удалить другой обработчик.
• Нулевой указатель через set_new_handler вызывает исключение сразу.
• В обработчике new можно вызвать исключение bad_alloc или завершить программу с помощью abort или exit.
• Для конкретного типа объектов можно задать свои set_new_handler и operator new.
C++ Learning (https://t.me/Learning_pluses) 👩💻
• Обработчик оператора 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) 👩💻
Между инициализацией и присваиванием есть тонкая разница.
• Инициализация означает присвоение значения переменной в момент её создания, а присваивание относится к изменению значения переменной на другое.
// Это инициализация. Хорошая практика —
// инициализировать переменную сразу при её создании.
int i = 0;
// Это присваивание, где начальное значение
// заменяется новым.
i = 10;
• В C++11 переменную можно инициализировать несколькими способами:
int i = {0};
int i{0};
int i(0);
C++ Learning (https://t.me/Learning_pluses) 👩💻
4 типовые ловушки в работе со строками в С и С++ и как их избежать
https://habr.com/ru/companies/ncloudtech/articles/830918/
https://habr.com/ru/companies/ncloudtech/articles/830918/
Хабр
4 типовые ловушки в работе со строками в С и С++ и как их избежать
Некорректное использование строк может стать настоящей ахиллесовой пятой защиты программы. Поэтому так важно применять актуальные подходы к их обработке. Под катом разберём несколько паттернов ошибок...
➡️ Разделяемые блокировки
Разделяемые блокировки полезны, когда:
• Блокировка удерживается долго.
• Несколько читателей могут одновременно её захватывать.
Схема разделяемой блокировки может быть эффективной, если:
• Блокировка удерживается длительное время, например, при работе с большим контейнером.
Основной вопрос:
• Не "пишу ли я в данные", а "как долго блокировка будет удерживаться читателями по сравнению с временем её захвата?"
C++ Learning (https://t.me/Learning_pluses) 👩💻
Разделяемые блокировки полезны, когда:
• Блокировка удерживается долго.
• Несколько читателей могут одновременно её захватывать.
Схема разделяемой блокировки может быть эффективной, если:
• Блокировка удерживается длительное время, например, при работе с большим контейнером.
Основной вопрос:
• Не "пишу ли я в данные", а "как долго блокировка будет удерживаться читателями по сравнению с временем её захвата?"
C++ Learning (https://t.me/Learning_pluses) 👩💻
Разгоняем C++ с кастомными аллокаторами
https://habr.com/ru/companies/otus/articles/830104/
https://habr.com/ru/companies/otus/articles/830104/
Хабр
Разгоняем C++ с кастомными аллокаторами
Привет, Хабр! Сегодня мы обратим свой взор на производительность в C++, и как ни странно, нашими главными героями станут не библиотеки или сложные алгоритмы, а казалось бы, простые аллокаторы. Но не...
➡️ Преобразование строк
• Преобразование строки в целое число или наоборот — это обычное явление в повседневном программировании.
• В 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++ 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
C++ известен тем, что позволяет работать с памятью напрямую. Здесь вы точно знаете, где и как расположен каждый из ваших объектов, сколько памяти он занимает.
Но можете ли вы принимать решение, где и как будет размещен ваш объект? Часто стандартные методы выделения памяти не удовлетворяют узким требованиям конкретной логики.
✅Обсудим, что C++ приобрел при введении полиморфных аллокаторов. И рассмотрим конкретный пример увеличения производительности программы с их помощью.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ruPlease open Telegram to view this post
VIEW IN TELEGRAM
Как поделить не деля или оптимизация деления компиляторам(и)
https://habr.com/ru/articles/833470/
https://habr.com/ru/articles/833470/
Хабр
Как поделить не деля или оптимизация деления компиляторам(и)
Если вы никогда не пробовали смотреть как код на C++ разворачивается компилятором в код Assembly – вас ждёт много сюрпризов, причём, не нужно смотреть какой-то замудренный исходный код полный...
➡️ Библиотека 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) 👩💻
• Это эффективная, типобезопасная и расширяемая библиотека, поддерживающая весь синтаксис форматирования 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) 👩💻
У некоторых людей есть боязнь использования бесконечных/полубесконечных циклов (это связано с тем, что они не любят неопределенность).
• На самом деле это очень полезная вещь, когда нужно «подождать пока что-то не случится»
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++) { //учимся считать }
• Это удобнее и красивее
👩💻
Думаю каждый встречался с циклами. Так вот. Там есть интересная особенность — нужно объявлять счетчик. Это дико бесит начинающих программистов, так что предлагаю такую конструкцию:
int i = 0;
for(i=0; i < n; i++) { //учимся считать }
• Заменять на такую:
for(int i = 0; i < n; i++) { //учимся считать }
• Это удобнее и красивее
👩💻
😈1
➡️ Магия byte
Не многие знаю что существует тип переменной byte. Число этого типа может быть в диапазоне от 0 до 255.
👀 А теперь посмотрите насколько это удобно использовать для хранения значений аналоговых входов Просто идеально… Главное в минус не загоняйте число)
🗣 А, и занимает это чудо в 2 раза меньше памяти. За такое вас по головке поглядят.
👩💻
Не многие знаю что существует тип переменной byte. Число этого типа может быть в диапазоне от 0 до 255.
👀 А теперь посмотрите насколько это удобно использовать для хранения значений аналоговых входов Просто идеально… Главное в минус не загоняйте число)
🗣 А, и занимает это чудо в 2 раза меньше памяти. За такое вас по головке поглядят.
👩💻
➡️ Использование алиасов для длинных типов
Это позволяет значительно упростить код, сделать его более читаемым и легким для поддержки.
• Например:
typedef std::vector StrVector;
C++ Learning (https://t.me/Learning_pluses) 👩💻
Это позволяет значительно упростить код, сделать его более читаемым и легким для поддержки.
• Например:
typedef std::vector StrVector;
C++ Learning (https://t.me/Learning_pluses) 👩💻
Реализуем эффективный тупль с помощью C++26
https://habr.com/ru/articles/835176/
https://habr.com/ru/articles/835176/
Хабр
Реализуем эффективный тупль с помощью C++26
Свет видел много любительских реализаций std::tuple , и реализация своих велосипедов — наверное, действительно действенный способ обучения: вряд-ли можно сказать, что ты что-то по-настоящему...
➡️ Использование RAII для Управления Ресурсами в C++
RAII (Resource Acquisition Is Initialization) — это идиома в C++, которая обеспечивает автоматическое управление ресурсами. Она гарантирует, что ресурсы будут освобождены, когда объект, владеющий ими, выходит из области видимости.
Класс FileWrapper:
• Конструктор открывает файл и выбрасывает исключение, если файл не может быть открыт.
• Деструктор гарантирует, что файл будет закрыт при выходе объекта из области видимости, даже если произошло исключение.
Метод write:
• Проверяет, открыт ли файл, и записывает сообщение в файл, если файл открыт.
Использование в main:
• Объект FileWrapper создается в блоке try, и файл автоматически закрывается, когда объект выходит из области видимости.
• Исключения обрабатываются в блоке catch, выводя сообщение об ошибке.
C++ Learning (https://t.me/Learning_pluses) 👩💻
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) 👩💻
Использование std::unique_ptr с пользовательскими удалителями позволяет автоматически управлять жизненным циклом объектов и безопасно освобождать ресурсы.
• Это может быть полезно для управления ресурсами, которые требуют специальной логики освобождения, таких как дескрипторы файлов или сетевые соединения.
C++ Learning (https://t.me/Learning_pluses) 👩💻
«Range-based for»: что интересного лежит на поверхности
https://habr.com/ru/articles/835130/
https://habr.com/ru/articles/835130/
Хабр
«Range-based for»: что интересного лежит на поверхности
Новый синтаксис для циклов for в C++ появился уже давно - более десяти лет назад в стандарте C++11. Идея, скрывающаяся за этим синтаксисом, не является сколь-нибудь запутанной, и практически все, кто...
➡️ Обнаружение утечек памяти с использованием нестандартного оператора new в C++
В C++ утечки памяти могут стать серьезной проблемой, особенно в больших проектах. Один из способов обнаружения утечек памяти — переопределение оператора new, чтобы отслеживать выделение и освобождение памяти.
• Мы переопределяем оператор new, чтобы отслеживать все выделения памяти, сохраняя указатели и размеры выделенных блоков в std::map.
• Переопределение оператора delete позволяет отслеживать освобождение памяти. Когда память освобождается, соответствующая запись удаляется из allocations.
• В конце программы проверяется, остались ли неосвобожденные участки памяти, что позволяет обнаружить утечки.
C++ Learning (https://t.me/Learning_pluses) 👩💻
В C++ утечки памяти могут стать серьезной проблемой, особенно в больших проектах. Один из способов обнаружения утечек памяти — переопределение оператора new, чтобы отслеживать выделение и освобождение памяти.
• Мы переопределяем оператор new, чтобы отслеживать все выделения памяти, сохраняя указатели и размеры выделенных блоков в std::map.
• Переопределение оператора delete позволяет отслеживать освобождение памяти. Когда память освобождается, соответствующая запись удаляется из allocations.
• В конце программы проверяется, остались ли неосвобожденные участки памяти, что позволяет обнаружить утечки.
C++ Learning (https://t.me/Learning_pluses) 👩💻