Библиотека C/C++ разработчика
6.8K subscribers
654 photos
690 videos
8 files
939 links
Полезные материалы по всему, что может быть полезно плюсовику/сишнику. По всем вопросам @evgenycarter
Download Telegram
Отсутствие динамической аллокации в embedded мире

Когда мы разрабатываем под embedded, нам приходится сталкиваться с такими флагами компиляции как -nostdlib -fno-exceptions -fno-rtti.

Во многих средах нет malloc/free (new/delete) и вообще нет встроенного выделения памяти.

Использование «больших» стандартных контейнеров C++ (например, std::vector) нередко исключено

В результате приходится решать задачу «ручного» управления памятью.

https://habr.com/ru/articles/918122/

#cpp #programming

👉 @cpp_lib
👍5🔥1
Руководство по сборке Qt под Windows из исходников с MinGW

Официальный способ установки готовых бинарников Qt - через онлайн инсталлятор. Однако он требует обязательной регистрации. Да еще и недоступен на территории РФ. Есть и другие способы получить бинарники, или собрать с компилятором от Microsoft, однако не всегда эти способы приемлемы. Сборка из исходников под Windows может оказаться несколько нетривиальна для новичков, потому сделал небольшую инструкцию по сборке Qt 5 и Qt 6. А так же рассмотрена базовая настройка QT Creator.

https://habr.com/ru/articles/917252/

#cpp #programming

👉 @cpp_lib
👍12🔥2
Улучшите читаемость и надежность кода на C++: узнайте основы эффективного рефакторинга

⏺️ На открытом уроке вы научитесь двум мощным приемам дизайна ПО: декомпозиции и абстрагированию.

▸ Мы покажем, как с их помощью улучшить производительность, сохраняя при этом ключевой принцип C++: zero overhead.
▸ Вместе с вами выполним рефакторинг небольшого приложения и повысим его читаемость и тестируемость.

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

Посетите открытый урок в преддверие старта курса «C++ Developer» и получите скидку на обучение!

🔴 Встречаемся 19 июня в 20:00 МСК.

Регистрируйтесь прямо сейчас, чтобы не пропустить:
https://vk.cc/cMTUi6

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👎1
📚 Продвинутые методы архивации: LZ77/78

Приглашаем на открытый урок.

🗓 25 июня в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Алгоритмы и структуры данных».

✔️ На этом вебинаре мы завершим создание архиватора, добавив алгоритм LZ77/78. Разберем принцип словарного сжатия, механизм поиска повторяющихся последовательностей и формат их кодирования.

✔️ Имплементируем выбранный алгоритм и проведем финальное сравнение всех трех методов сжатия (RLE, Huffman, LZ77/78). Определим, какие алгоритмы лучше работают для различных типов файлов и почему.

Завершающее практическое занятие для тех, кто хочет освоить продвинутые алгоритмы и увидеть их применение в реальном проекте.​​​​​​​​​​​​​​​​

🎁 Всем участникам вебинара дарим промокод, который дает скидку на обучение - Algo5

👉 Регистрация на вебинар: https://vk.cc/cMXv29

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
2👎1
Media is too big
VIEW IN TELEGRAM
Как заставить шаблоны компилироваться быстро и выглядеть опрятно
Павел Сухов

Каждый раз при наборе ключевого слова template у меня за плечом магическим образом появляется какой-то коллега и задает стандартные вопросы:
— Это же будет долго компилироваться?
— Это же будет нечитабельно, мы не сможем это поддерживать?
— Там же будут отвратительные ошибки компиляции, которые мы разберем только консилиумом буддийских монахов?

И все эти вопросы повторяются раз за разом. Компилируется долго не все, а то, что компилируется долго, — зачастую можно ускорить. Писать шаблоны можно по-разному, кое-что можно написать красиво, емко и наглядно. Да и ошибки можно причесать новыми инструментами современного С++.

В докладе — некоторые идеи по поводу медленных и сложных шаблонов, идеи по их ускорению, и развенчание некоторых мифов.

источник

#cpp #programming

👉 @cpp_lib
👍2
Пишем игру для игровой ретро-консоли Anbernic на C++

Дисклеймер
Сразу скажу, что почти всё, что описано в этой статье, я делал первый раз в жизни, поэтому я не мог не совершить ошибок. Некоторые мои решения и заявления могут быть некорректными. Воспринимать эту статью как туториал можно только на свой страх и риск. Для нормального восприятия этой статьи вы должны обладать базовыми навыками программирования на C++ и хотя бы общим представлением о том, что из себя представляет операционная система Linux.

Как всё начиналось
Не так давно ко мне в руки попала игровая консоль Anbernic RG35XX SP. Это портативная игровая консоль на базе четырёхъядерного процессора Allwinner H700 с ядрами Cortex-A53, которая имеет на борту операционную систему OFW (дистрибутив Linux, основанный на Ubuntu). Консоль предназначена для запуска ретро игр на эмуляторе Retroarch. Этот эмулятор поддерживает эмуляцию множества популярных игровых консолей 90х и 2000х и позволяет запускать ТЫСЯЧИ популярных игр, которые можно устанавливать на SD карточку.

https://habr.com/ru/articles/897338/

#cpp #programming

👉 @cpp_lib
👍42🔥2
Низкоуровневый скриптинг на C++ для игровых движков

Я постарался охватить только основы, но текст всё равно получился очень длинным.

libriscv — это зрелый эмулятор RISC-V, который в настоящее время используется в игровых движках. Насколько мне известно, это единственный эмулятор, в котором основной акцент делается на обработке задержек, а также предоставляются специализированные решения и инструменты для выполнения быстрых вызовов при обращении с функциями — как входящих, так и исходящих. Причём, всё это заключено в безопасной песочнице. Задержки, наблюдаемые в libriscv, гораздо ниже, чем в эталонных эмуляторах.

Меня многие спрашивали, как им пользоваться, но здесь интереснее то, как вообще может прийти в голову мысль писать скрипты на C++ — не слишком ли сложно это будет? Оказывается, нет, не очень. Вот уже несколько лет я пишу на C++ скрипты для одной большой и одной не очень большой игры, и меня почти не посещало ощущение, что виной каким-то возникающим при этом проблемам являются язык C++ или связанные с ним скриптовые API. Я много лет программирую на Lua, а до этого пользовался обычным C. Но сейчас современный идиоматический C++ — то, что мне нужно. Причём, я могу писать на этом языке как в самом игровом движке, так и за его пределами, при этом опираясь (буквально) на одни и те же абстракции и оперируя одинаковыми структурами данных. Наконец, C++ просто очень мощный. Правда, я признаю, что о вкусах не спорят, и при работе с C++ также не обойтись без компромиссов.

https://habr.com/ru/articles/919620/

#cpp #programming

👉 @cpp_lib
🔥61👍1
Лаконичный макрос defer для C++17

Ручное управление ресурсами в низкоуровневом си-подобном коде на C++ — довольно хлопотное занятие. Создание достойных RAII-врапперов для каждого используемого сишного API не всегда практично, а использование подходов с goto cleanup или множеством вложенных if (success) вредит читаемости кода.

Макрос defer как никогда кстати! Отложенная лямбда будет выполнена при выходе из области видимости, независимо от того, будет ли выполнен return, брошено исключение, или даже выполнен goto наружу. Данный макрос по-настоящему zero-cost и не зависит от рантайма C или стандартной библиотеки, поэтому его можно использовать даже в разработке под ядро ОС.

https://habr.com/ru/articles/916732/

#cpp #programming

👉 @cpp_lib
3👍2🔥2
Удобный способ работы с перечислениями в C++ — приведение enum к строке и обратно.

Во многих проектах используется enum, чтобы задать ограниченный набор значений. Но как вывести значение enum в лог? Или, наоборот, прочитать из строки и получить нужное значение enum?

C++ сам по себе не умеет конвертировать enum в строку и обратно. Вот простая реализация этого функционала через std::unordered_map:


enum class LogLevel {
Debug,
Info,
Warning,
Error
};

const std::unordered_map<LogLevel, std::string> LogLevelToString = {
{LogLevel::Debug, "Debug"},
{LogLevel::Info, "Info"},
{LogLevel::Warning, "Warning"},
{LogLevel::Error, "Error"},
};

const std::unordered_map<std::string, LogLevel> StringToLogLevel = {
{"Debug", LogLevel::Debug},
{"Info", LogLevel::Info},
{"Warning", LogLevel::Warning},
{"Error", LogLevel::Error},
};

std::string to_string(LogLevel level) {
return LogLevelToString.at(level);
}

LogLevel to_log_level(const std::string& str) {
return StringToLogLevel.at(str);
}


Такой подход хорошо работает, если enum не слишком большой. Если значений много — можно автоматизировать генерацию через макросы или использовать библиотеки вроде magic_enum.


#cpp #programming

👉 @cpp_lib
👍62
RAII 2.0: RAII как архитектурный инструмент в C++

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

В этой статье я хочу поговорить о том, как RAII можно использовать для контроля жизненного цикла асинхронных операций, транзакций или подписок, гарантируя их корректное завершение или откат до прежнего состояния.

https://habr.com/ru/articles/901092/

#cpp #programming

👉 @cpp_lib
👍52🤔2
This media is not supported in your browser
VIEW IN TELEGRAM
Сегментация памяти в программе на C/C++

#cpp #programming

👉 @cpp_lib
👍163
FastCGo: как мы ускорили вызов C-кода в Go в 16,5 раза

Всем привет! Меня зовут Владимир Пустовалов, я C++ разработчик в команде Deckhouse компании «Флант». Мои коллеги — DevOps-инженеры — на данный момент обслуживают более 600 кластеров, и, естественно, в каждом из них развёрнута система мониторинга.

Изначально мы использовали Prometheus — опенсорсную систему мониторинга, написанную на Go. По нашей статистике, она занимала около 20 % ресурсов каждого кластера. Мы не могли с этим мириться и поэтому разработали проект под названием Prom++, в котором многократно сократили потребление оперативной памяти и снизили нагрузку на центральный процессор.

Кратко о том, что мы сделали: переписали на С++ ядро хранения и обработки горячих данных, при этом вся оркестрация и периферия остались в Prometheus на Go, что позволило сохранить полную совместимость с Prometheus. Для частых вызовов кода C++ мы использовали механизм CGo, однако первые тесты показали, что производительность CPU практически не улучшилась из-за медлительности CGo. В итоге мы переписали CGo, создав собственный механизм вызова.

Что будет в этой статье:
Разберём, что такое CGo и почему он медленный.
Создадим простой собственный механизм CGo-вызова.
Доведём этот механизм до полноценного решения.

https://habr.com/ru/companies/flant/articles/923912/

#cpp #programming

👉 @cpp_lib
👍1