➡️ FloatX
FloatX — это библиотека для эмуляции чисел с плавающей запятой низкой точности. Ее можно использовать в программах на C++, Python и Fortran.
• Заголовочная библиотека: расширяет типы с плавающей запятой за пределы одинарной и двойной точности.
• Шаблонные типы: позволяют задать количество бит для экспоненты и других важных частей чисел с плавающей запятой.
• Разработана на C++: основана на библиотеке FlexFloat (разработана на C), использует обертки на C++.
• Расширенные функциональности: предоставляет надмножество возможностей FlexFloat.
• Ограничения: не реализует произвольные типы чисел с плавающей запятой.
🔗 Ссылочка на доку (https://github.com/oprecomp/FloatX)
C++ Learning (https://t.me/Learning_pluses) 👩💻
FloatX — это библиотека для эмуляции чисел с плавающей запятой низкой точности. Ее можно использовать в программах на C++, Python и Fortran.
• Заголовочная библиотека: расширяет типы с плавающей запятой за пределы одинарной и двойной точности.
• Шаблонные типы: позволяют задать количество бит для экспоненты и других важных частей чисел с плавающей запятой.
• Разработана на C++: основана на библиотеке FlexFloat (разработана на C), использует обертки на C++.
• Расширенные функциональности: предоставляет надмножество возможностей FlexFloat.
• Ограничения: не реализует произвольные типы чисел с плавающей запятой.
🔗 Ссылочка на доку (https://github.com/oprecomp/FloatX)
C++ Learning (https://t.me/Learning_pluses) 👩💻
📌Пройдите тест из 10 вопросов и проверьте, насколько вы готовы к обучению на углубленном курсе «IoT Developer» от OTUS. Сможете сдать - пройдете на курс со скидкой!
⏰ Время прохождения теста ограничено 10 минут
👉ПРОЙТИ ТЕСТ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
➡️ oneTBB
oneTBB (oneAPI Threading Building Blocks) — это библиотека на C++ для упрощения добавления параллелизма в сложные приложения.
• Гибкость: облегчает написание параллельных программ на C++.
• Многопоточность: не нужно быть экспертом по потокам для использования.
• Функции: предоставляет набор функций, классов и интерфейсов для параллелизации и масштабирования кода.
• Совместимость: работает с другими библиотеками потоков.
• Программирование: ориентирована на масштабируемое и параллельное программирование, а не просто на потоки.
🔗 Ссылочка на доку (https://github.com/oneapi-src/oneTBB)
C++ Learning (https://t.me/Learning_pluses) 👩💻
oneTBB (oneAPI Threading Building Blocks) — это библиотека на C++ для упрощения добавления параллелизма в сложные приложения.
• Гибкость: облегчает написание параллельных программ на C++.
• Многопоточность: не нужно быть экспертом по потокам для использования.
• Функции: предоставляет набор функций, классов и интерфейсов для параллелизации и масштабирования кода.
• Совместимость: работает с другими библиотеками потоков.
• Программирование: ориентирована на масштабируемое и параллельное программирование, а не просто на потоки.
🔗 Ссылочка на доку (https://github.com/oneapi-src/oneTBB)
C++ Learning (https://t.me/Learning_pluses) 👩💻
Ваши проекты скучны, а возможности ограничены? Хотите создавать крутые приложения для современной техники и работать с крупными государственными компаниями и бизнесом?
Представьте себе, что вы стали мастером в разработке на Qt и ОС «Аврора». Вы создаете интерфейсы для цифровой техники, мобильные приложения для госкомпаний и крупного бизнеса, а ваши навыки востребованы как никогда.
Присоединяйтесь к онлайн-курсу «Разработка прикладного ПО на Qt и ОС «Аврора» и сделайте этот прыжок в будущее!
Что вам даст этот курс:
- освоите Qt — одну из лучших кроссплатформенных библиотек для разработки UI на С++;
- изучите нативную разработку для Авроры 5.0;
- изучите структуру библиотеки Qt и научитесь писать программы на QML.
И многое другое!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ruPlease open Telegram to view this post
VIEW IN TELEGRAM
➡️ Оптимизация работы с большими массивами: Использование std::vector и перемещения
В C++ работа с большими массивами может быть неэффективной, если каждый раз создавать копии данных.
• Вместо этого можно воспользоваться возможностями стандартной библиотеки, такими как std::vector и перемещение (move semantics), чтобы улучшить производительность.
• std::vector — это динамический массив с возможностью автоматического управления памятью.
• Перемещение (std::move) позволяет передать владение данными без копирования, что существенно снижает накладные расходы при работе с большими объемами данных.
• После перемещения myVector остаётся в валидном, но неопределённом состоянии. В данном случае его размер будет равен 0.
C++ Learning (https://t.me/Learning_pluses) 👩💻
В C++ работа с большими массивами может быть неэффективной, если каждый раз создавать копии данных.
• Вместо этого можно воспользоваться возможностями стандартной библиотеки, такими как std::vector и перемещение (move semantics), чтобы улучшить производительность.
• std::vector — это динамический массив с возможностью автоматического управления памятью.
• Перемещение (std::move) позволяет передать владение данными без копирования, что существенно снижает накладные расходы при работе с большими объемами данных.
• После перемещения myVector остаётся в валидном, но неопределённом состоянии. В данном случае его размер будет равен 0.
C++ Learning (https://t.me/Learning_pluses) 👩💻
➡️ Индексирование массива (Оператор подиндексации) является коммутативным
Индексирование массива — обычная операция для всех программистов и в целом одинаково во всех языках программирования. Однако в C++ вы можете поменять местами массив и индекс, получая такой код:
int arr[] = {1, 2, 3, 4};
std::cout
Индексирование массива — обычная операция для всех программистов и в целом одинаково во всех языках программирования. Однако в C++ вы можете поменять местами массив и индекс, получая такой код:
int arr[] = {1, 2, 3, 4};
std::cout
➡️ Собственный 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