C++_BE1
Open in Telegram
Канал по C/C++, полезный и интересный контент для всех уровней. По вопросам сотрудничества @cyberJohnny
Show more406
Subscribers
No data24 hours
-27 days
No data30 days
Posts Archive
406
➡️ Оператор decltype для создания зависимых типов в C++
В C++ оператор decltype позволяет определить тип переменной на основе типа другого выражения. Это особенно полезно в шаблонном программировании для создания зависимых типов, когда точный тип заранее неизвестен.
• Оператор decltype определяет тип sum на основе типа элементов, возвращаемых итератором контейнера. Это позволяет избежать жесткого кодирования типов и делает код более гибким.
• Использование decltype в шаблонных функциях позволяет писать более универсальный код, который корректно работает с различными типами контейнеров.
C++ Learning (https://t.me/Learning_pluses) 👩💻
406
➡️ Обнаружение утечек памяти с использованием нестандартного оператора new в C++
В C++ утечки памяти могут стать серьезной проблемой, особенно в больших проектах. Один из способов обнаружения утечек памяти — переопределение оператора new, чтобы отслеживать выделение и освобождение памяти.
• Мы переопределяем оператор new, чтобы отслеживать все выделения памяти, сохраняя указатели и размеры выделенных блоков в std::map.
• Переопределение оператора delete позволяет отслеживать освобождение памяти. Когда память освобождается, соответствующая запись удаляется из allocations.
• В конце программы проверяется, остались ли неосвобожденные участки памяти, что позволяет обнаружить утечки.
C++ Learning (https://t.me/Learning_pluses) 👩💻
406
➡️ Управление памятью с использованием std::unique_ptr и пользовательских удалителей
Использование std::unique_ptr с пользовательскими удалителями позволяет автоматически управлять жизненным циклом объектов и безопасно освобождать ресурсы.
• Это может быть полезно для управления ресурсами, которые требуют специальной логики освобождения, таких как дескрипторы файлов или сетевые соединения.
C++ Learning (https://t.me/Learning_pluses) 👩💻
406
➡️ Использование RAII для Управления Ресурсами в C++
RAII (Resource Acquisition Is Initialization) — это идиома в C++, которая обеспечивает автоматическое управление ресурсами. Она гарантирует, что ресурсы будут освобождены, когда объект, владеющий ими, выходит из области видимости.
Класс FileWrapper:
• Конструктор открывает файл и выбрасывает исключение, если файл не может быть открыт.
• Деструктор гарантирует, что файл будет закрыт при выходе объекта из области видимости, даже если произошло исключение.
Метод write:
• Проверяет, открыт ли файл, и записывает сообщение в файл, если файл открыт.
Использование в main:
• Объект FileWrapper создается в блоке try, и файл автоматически закрывается, когда объект выходит из области видимости.
• Исключения обрабатываются в блоке catch, выводя сообщение об ошибке.
C++ Learning (https://t.me/Learning_pluses) 👩💻
406
➡️ Использование алиасов для длинных типов
Это позволяет значительно упростить код, сделать его более читаемым и легким для поддержки.
• Например:
typedef std::vector StrVector;
C++ Learning (https://t.me/Learning_pluses) 👩💻
406
➡️ Магия byte
Не многие знаю что существует тип переменной byte. Число этого типа может быть в диапазоне от 0 до 255.
👀 А теперь посмотрите насколько это удобно использовать для хранения значений аналоговых входов Просто идеально… Главное в минус не загоняйте число)
🗣 А, и занимает это чудо в 2 раза меньше памяти. За такое вас по головке поглядят.
👩💻
406
➡️ Магия счётчиков
Думаю каждый встречался с циклами. Так вот. Там есть интересная особенность — нужно объявлять счетчик. Это дико бесит начинающих программистов, так что предлагаю такую конструкцию:
int i = 0;
for(i=0; i < n; i++) { //учимся считать }
• Заменять на такую:
for(int i = 0; i < n; i++) { //учимся считать }
• Это удобнее и красивее
👩💻
406
➡️ Infinity Loop
У некоторых людей есть боязнь использования бесконечных/полубесконечных циклов (это связано с тем, что они не любят неопределенность).
• На самом деле это очень полезная вещь, когда нужно «подождать пока что-то не случится»
while(digitalRead(button) ≠ LOW) { ; }
• Этот код ждет, пока кнопка (пин button) не отпустится. Это очень полезная фишка, которую можно использовать для ожидания какого-либо события.
C++ Learning (https://t.me/Learning_pluses) 👩💻
406
➡️ Библиотека 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) 👩💻
406
Как поделить не деля или оптимизация деления компиляторам(и)
https://habr.com/ru/articles/833470/
406
🔴 Как прокачать навыки в C++?
Приходите на открытом практическом уроке «Условные переменные в С++» от OTUS, где мы разберем:
— что такое std::condition_variable и какие задачи он решает;
— типовые ошибки при его использовании;
— что такое spurious wakeup.
А также напишем несколько concurrency-примитивов на основе condition_variable.
🙋♂️Спикер — ведущий программист с большим международным опытом.
⏰ Встречаемся 11 июня в 20:00 мск в преддверии старта курса «C++ Developer. Professional». Все участники вебинара получат специальную цену на обучение и консультацию от менеджеров OTUS!
➡️ Регистрируйтесь прямо сейчас, чтобы не пропустить бесплатный урок.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
406
Открытый урок. Аллокаторы в C++: Что делать, если менеджер памяти вас разочаровывает? 🤔
C++ известен тем, что позволяет работать с памятью напрямую. Здесь вы точно знаете, где и как расположен каждый из ваших объектов, сколько памяти он занимает.
Но можете ли вы принимать решение, где и как будет размещен ваш объект? Часто стандартные методы выделения памяти не удовлетворяют узким требованиям конкретной логики.
⚡️Присоединяйтесь к открытому вебинару 8 августа в 20:00 мск! Поговорим, зачем в C++ существуют аллокаторы.
✅Обсудим, что C++ приобрел при введении полиморфных аллокаторов. И рассмотрим конкретный пример увеличения производительности программы с их помощью.
➡️ Зарегистрируйтесь сейчас, чтобы не пропустить бесплатный урок: https://clck.ru/3CGAQE
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru406
➡️ Преобразование строк
• Преобразование строки в целое число или наоборот — это обычное явление в повседневном программировании.
• В 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) 👩💻
406
➡️ Разделяемые блокировки
Разделяемые блокировки полезны, когда:
• Блокировка удерживается долго.
• Несколько читателей могут одновременно её захватывать.
Схема разделяемой блокировки может быть эффективной, если:
• Блокировка удерживается длительное время, например, при работе с большим контейнером.
Основной вопрос:
• Не "пишу ли я в данные", а "как долго блокировка будет удерживаться читателями по сравнению с временем её захвата?"
C++ Learning (https://t.me/Learning_pluses) 👩💻
406
4 типовые ловушки в работе со строками в С и С++ и как их избежать
https://habr.com/ru/companies/ncloudtech/articles/830918/
406
➡️ Инициализация и присваивание
Между инициализацией и присваиванием есть тонкая разница.
• Инициализация означает присвоение значения переменной в момент её создания, а присваивание относится к изменению значения переменной на другое.
// Это инициализация. Хорошая практика —
// инициализировать переменную сразу при её создании.
int i = 0;
// Это присваивание, где начальное значение
// заменяется новым.
i = 10;
• В C++11 переменную можно инициализировать несколькими способами:
int i = {0};
int i{0};
int i(0);
C++ Learning (https://t.me/Learning_pluses) 👩💻
