Опыт создания UI библиотеки на C++
Началось все почти два года назад в декабрe, наш основной проект (видео мессенджер) использовал WTL для Windows и GTKmm для Linux. Поддержки мака не было. Огромной неприятностью было тащить два идентичных клиента, которые, по идее, должны делать все строго одно и тоже. Разумеется, это никогда не получалось. От мысли что надо бы сделать ещё один нативный клиент для мака начинался нервный тик...
На резонный вопрос - почему сразу делалось не на Qt могу лишь ответить, что это связано с, так скажем, гурманскими предпочтениями и, отчасти, с любовью к монолитным exe. Да и не требовалось на старте ничего кроме винды.
В течение шести лет жизни с двумя кодовыми базами одного и того же, неспешно подбирались легковесные UI библиотеки написанные хотя бы в стиле C++11.
Надо сказать, что мы активно используем boost и всей душой, как можем, его любим...
В 2021 году видимо Гугл работал плохо или звёзды так сошлись, но не нашлось ничего стоящего. Все что попадалось - основанные на рендеринге html проекты и обертка над wxWidgets. Сейчас то мы знаем про lvgl, да... А вообще, тысячи их.
wxWidgets не плох, но хотелось своего рисования, без окошек под кнопки, поля ввода и списки, boost/bsd подобной лицензией, максимально лаконичной, и в идеале работающей от Windows XP / CentOS 6 на стандартном GDI / X11 до Vulkan на современных машинах.
В итоге, все же было принято волевое решение сделать минимальный UI фреймворк для этого проекта, и сразу выпускать его в Open Source под лицензией boost.
https://habr.com/ru/articles/768336/
#cpp
👉 @Bookflow
Началось все почти два года назад в декабрe, наш основной проект (видео мессенджер) использовал WTL для Windows и GTKmm для Linux. Поддержки мака не было. Огромной неприятностью было тащить два идентичных клиента, которые, по идее, должны делать все строго одно и тоже. Разумеется, это никогда не получалось. От мысли что надо бы сделать ещё один нативный клиент для мака начинался нервный тик...
На резонный вопрос - почему сразу делалось не на Qt могу лишь ответить, что это связано с, так скажем, гурманскими предпочтениями и, отчасти, с любовью к монолитным exe. Да и не требовалось на старте ничего кроме винды.
В течение шести лет жизни с двумя кодовыми базами одного и того же, неспешно подбирались легковесные UI библиотеки написанные хотя бы в стиле C++11.
Надо сказать, что мы активно используем boost и всей душой, как можем, его любим...
В 2021 году видимо Гугл работал плохо или звёзды так сошлись, но не нашлось ничего стоящего. Все что попадалось - основанные на рендеринге html проекты и обертка над wxWidgets. Сейчас то мы знаем про lvgl, да... А вообще, тысячи их.
wxWidgets не плох, но хотелось своего рисования, без окошек под кнопки, поля ввода и списки, boost/bsd подобной лицензией, максимально лаконичной, и в идеале работающей от Windows XP / CentOS 6 на стандартном GDI / X11 до Vulkan на современных машинах.
В итоге, все же было принято волевое решение сделать минимальный UI фреймворк для этого проекта, и сразу выпускать его в Open Source под лицензией boost.
https://habr.com/ru/articles/768336/
#cpp
👉 @Bookflow
👍3
Media is too big
VIEW IN TELEGRAM
Сборка C++ проектов. Оптимизации компилятора. Inline, constexpr, alignment. Game Engine серии
0:00:00 - Введение
0:02:26 - Дизассемблер
0:09:31 - Общие оптимизации
0:20:46 - Inline
0:35:24 - Constexpr
0:45:28 - Compile-time raytracer
0:52:40 - Internal vs. external linkage
0:55:18 - Выравнивание структур
1:06:46 - Pragma optimize
источник
#cpp
👉 @Bookflow
0:00:00 - Введение
0:02:26 - Дизассемблер
0:09:31 - Общие оптимизации
0:20:46 - Inline
0:35:24 - Constexpr
0:45:28 - Compile-time raytracer
0:52:40 - Internal vs. external linkage
0:55:18 - Выравнивание структур
1:06:46 - Pragma optimize
источник
#cpp
👉 @Bookflow
👍3
Media is too big
VIEW IN TELEGRAM
С++ фреймворк для описания пайплайнов распределенных вычислений
Огромное количество С++ кода в Яндексе можно описать словами «распределенные вычисления». Доклад посвящен активно разрабатываемому сейчас С++ фреймворку, вдохновленному библиотеками std::ranges и Apache Beam. Этот фреймворк позволяет достаточно компактно и просто описывать такие процессы и запускать их в MapReduce-режиме для обработки таблиц данных или в real-time режиме для обработки бесконечных потоков (очередей) данных.
Доклад не предполагает знакомства с какими-либо специфичными технологиями. Он будет полезен разработчикам и пользователям различных распределенных систем обработки данных и тем, кто интересуется этой темой.
источник
#cpp
👉 @Bookflow
Огромное количество С++ кода в Яндексе можно описать словами «распределенные вычисления». Доклад посвящен активно разрабатываемому сейчас С++ фреймворку, вдохновленному библиотеками std::ranges и Apache Beam. Этот фреймворк позволяет достаточно компактно и просто описывать такие процессы и запускать их в MapReduce-режиме для обработки таблиц данных или в real-time режиме для обработки бесконечных потоков (очередей) данных.
Доклад не предполагает знакомства с какими-либо специфичными технологиями. Он будет полезен разработчикам и пользователям различных распределенных систем обработки данных и тем, кто интересуется этой темой.
источник
#cpp
👉 @Bookflow
👍3
DPP
D++ — это легковесная и эффективная библиотека для Discord, написанная на современном C++. Она охватывает максимально возможную часть спецификации API и обладает невероятно малым объемом памяти даже при кэшировании больших объемов данных.
https://github.com/brainboxdotcc/DPP
#cpp
👉 @bookflow
D++ — это легковесная и эффективная библиотека для Discord, написанная на современном C++. Она охватывает максимально возможную часть спецификации API и обладает невероятно малым объемом памяти даже при кэшировании больших объемов данных.
https://github.com/brainboxdotcc/DPP
#cpp
👉 @bookflow
👍5
Тысяча и одна библиотека С++
В жизни каждого программиста С++ рано или поздно возникает задача, которую кто-либо уже решил. Однако найти это решение бывает очень непросто в силу разных причин: оно недостаточно разрекламировано, либо имеет нечеткую документацию, или возникает проблема языкового барьера, ну, или поисковики просто плохо ищут).
Столкнувшись много раз подряд с тем, что найти что-то толковое довольно непросто, я решил попробовать распутать это узел и предложить для русскоязычных читателей свой справочник классных библиотек на С++. Я исходил из этого источника. Это очень многогранный и объемный список библиотек языка С++, но, скажем так, у меня были к нему вопросы. Потому я сделал перевод, затем значительно улучшил его в плане содержания (далее объясню, как, почему и зачем). На выходе получилось около 1000 библиотек. Как в сказке). Они, конечно, не покрывают все возможные задачи и предметные области, но поверьте, они затрагивают действительно многое.
https://habr.com/ru/articles/831754/
#cpp
👉 @bookflow
В жизни каждого программиста С++ рано или поздно возникает задача, которую кто-либо уже решил. Однако найти это решение бывает очень непросто в силу разных причин: оно недостаточно разрекламировано, либо имеет нечеткую документацию, или возникает проблема языкового барьера, ну, или поисковики просто плохо ищут).
Столкнувшись много раз подряд с тем, что найти что-то толковое довольно непросто, я решил попробовать распутать это узел и предложить для русскоязычных читателей свой справочник классных библиотек на С++. Я исходил из этого источника. Это очень многогранный и объемный список библиотек языка С++, но, скажем так, у меня были к нему вопросы. Потому я сделал перевод, затем значительно улучшил его в плане содержания (далее объясню, как, почему и зачем). На выходе получилось около 1000 библиотек. Как в сказке). Они, конечно, не покрывают все возможные задачи и предметные области, но поверьте, они затрагивают действительно многое.
https://habr.com/ru/articles/831754/
#cpp
👉 @bookflow
👍2
Strlcpy, или как CPU противоречат здравому смыслу
Один из моих старых постов о strlcpy недавно вызвал обсуждения на различных форумах. Вероятно, с этим как-то связан выпуск новой версии POSIX. Многие авторы приводили один контраргумент, который я слышал и раньше:
В общем случае, когда исходная строка умещается в конечный буфер, strlcpy будет обходить строку только один раз, а strlen + memcpy будут обходить её дважды.
Под этим аргументом скрывается допущение о том, что однократный обход строки выполняется быстрее. И, честно говоря, это вполне разумное допущение. Но справедливо ли оно? Об этом мы и поговорим в статье.
https://habr.com/ru/articles/838116/
#cpp
👉 @bookflow
Один из моих старых постов о strlcpy недавно вызвал обсуждения на различных форумах. Вероятно, с этим как-то связан выпуск новой версии POSIX. Многие авторы приводили один контраргумент, который я слышал и раньше:
В общем случае, когда исходная строка умещается в конечный буфер, strlcpy будет обходить строку только один раз, а strlen + memcpy будут обходить её дважды.
Под этим аргументом скрывается допущение о том, что однократный обход строки выполняется быстрее. И, честно говоря, это вполне разумное допущение. Но справедливо ли оно? Об этом мы и поговорим в статье.
https://habr.com/ru/articles/838116/
#cpp
👉 @bookflow
👍3
🛠 Мост между JavaScript и C++ через WebAssembly
Если ты хочешь интегрировать C++ в свой JavaScript-проект, но не знаешь, с чего начать, этот гайд для тебя!
Автор делится пошаговыми инструкциями:
🔹Установка Emscripten
🔹Компиляция C++ в WASM
🔹Передача данных между C++ и JavaScript
🔹Использование Emscripten Bindings для упрощения взаимодействия
Разберёмся, как передавать массивы, строки и структуры, и как избежать типичных ошибок при работе с памятью в WASM.
📖 Читай подробнее: https://habr.com/ru/articles/837692/
#Cpp #Js
👉@bookflow
Если ты хочешь интегрировать C++ в свой JavaScript-проект, но не знаешь, с чего начать, этот гайд для тебя!
Автор делится пошаговыми инструкциями:
🔹Установка Emscripten
🔹Компиляция C++ в WASM
🔹Передача данных между C++ и JavaScript
🔹Использование Emscripten Bindings для упрощения взаимодействия
Разберёмся, как передавать массивы, строки и структуры, и как избежать типичных ошибок при работе с памятью в WASM.
📖 Читай подробнее: https://habr.com/ru/articles/837692/
#Cpp #Js
👉@bookflow
👍5
Что значит инициализировать int в C++?
Недавно я получил по почте от Сэма Джонсона этот вопрос. Вот слегка отредактированное письмо Сэма:
«Возьмём для примера этот код в локальной области видимости функции:
Многие люди считают, что инициализация происходит в строке 1, потому что веб-сайты наподобие cppreference дают такое определение: "Инициализация переменной предоставляет его начальное значение на момент создания".
Однако я убеждён, что инициализация происходит в строке 2, потому что [в разных хороших книгах по C++] инициализация определяется как первое существенное значение, попадающее в переменную.
Можете ли вы сказать, какая строка считается инициализацией?»
https://herbsutter.com/2024/08/07/reader-qa-what-does-it-mean-to-initialize-an-int/
#cpp
👉@bookflow
Недавно я получил по почте от Сэма Джонсона этот вопрос. Вот слегка отредактированное письмо Сэма:
«Возьмём для примера этот код в локальной области видимости функции:
int a;
a = 5;
Многие люди считают, что инициализация происходит в строке 1, потому что веб-сайты наподобие cppreference дают такое определение: "Инициализация переменной предоставляет его начальное значение на момент создания".
Однако я убеждён, что инициализация происходит в строке 2, потому что [в разных хороших книгах по C++] инициализация определяется как первое существенное значение, попадающее в переменную.
Можете ли вы сказать, какая строка считается инициализацией?»
https://herbsutter.com/2024/08/07/reader-qa-what-does-it-mean-to-initialize-an-int/
#cpp
👉@bookflow
👍3
Дорогая, я уменьшил {fmt}: уменьшил размер до 14kB и избавился от рантайма C++
Библиотека форматирования {fmt} известна своим небольшим влиянием на размер бинарников. Чаще всего её код в несколько раз меньше по сравнению с такими библиотеками, как IOStreams, Boost Format или, что иронично, tinyformat.
Давайте разберем, как можно уменьшить размер бинарников еще больше!
https://habr.com/ru/companies/beget/articles/842566/
#cpp
👉@bookflow
Библиотека форматирования {fmt} известна своим небольшим влиянием на размер бинарников. Чаще всего её код в несколько раз меньше по сравнению с такими библиотеками, как IOStreams, Boost Format или, что иронично, tinyformat.
Давайте разберем, как можно уменьшить размер бинарников еще больше!
https://habr.com/ru/companies/beget/articles/842566/
#cpp
👉@bookflow
👍2
Media is too big
VIEW IN TELEGRAM
Что можно знать о C++ в 16 лет?
Сегодня мы собеседуем Богдана и проверяем его познания в C++
Проверим, насколько рано можно программировать.
Приятного просмотра!
источник
#cpp
👉@bookflow
Сегодня мы собеседуем Богдана и проверяем его познания в C++
Проверим, насколько рано можно программировать.
Приятного просмотра!
источник
#cpp
👉@bookflow
👍8
Контейнеры Linux в 500 строках кода
Я уже много лет прямо или косвенно использую контейнеры Linux, но мне хотелось познакомиться с ними поближе. Поэтому я написал немного кода. Раньше это было 500 строк кода, клянусь, но я немного изменил его с момента публикации; в итоге получилось примерно на 70 строк больше.
Статья объясняет, как работают Linux-контейнеры, показывая минимальную реализацию на 500 строках кода. Она рассматривает ключевые концепции, такие как namespaces, cgroups и монтирование файловых систем, и даёт простое, но функциональное представление о механике, которая лежит в основе контейнеров, например, Docker. Основная цель — дать читателю ясное и практическое введение в то, как работают контейнеры на базовом уровне.
https://blog.lizzie.io/linux-containers-in-500-loc.html
#cpp
👉@bookflow
Я уже много лет прямо или косвенно использую контейнеры Linux, но мне хотелось познакомиться с ними поближе. Поэтому я написал немного кода. Раньше это было 500 строк кода, клянусь, но я немного изменил его с момента публикации; в итоге получилось примерно на 70 строк больше.
Статья объясняет, как работают Linux-контейнеры, показывая минимальную реализацию на 500 строках кода. Она рассматривает ключевые концепции, такие как namespaces, cgroups и монтирование файловых систем, и даёт простое, но функциональное представление о механике, которая лежит в основе контейнеров, например, Docker. Основная цель — дать читателю ясное и практическое введение в то, как работают контейнеры на базовом уровне.
https://blog.lizzie.io/linux-containers-in-500-loc.html
#cpp
👉@bookflow
👍4
Создаем свой собственный Lisp
Если вы хотите изучить язык C или когда-либо задумывались о том, как создать свой собственный язык программирования, эта книга для вас.
Всего за несколько строк кода я научу вас использовать C, и вместе мы начнем создавать ваш собственный язык.
По пути мы узнаем о странной и удивительной природе Lisp, как развивать реальный проект, лаконично решать задачи и писать красивый код!
Эту книгу можно бесплатно прочитать онлайн, так что вы можете начать прямо сейчас! Но для тех, кто хочет выразить свою поддержку или получить лучший опыт чтения, книга также доступна для покупки в печатном формате или недорого в основных электронных форматах.
https://www.buildyourownlisp.com/contents
#cpp
👉 @bookflow
Если вы хотите изучить язык C или когда-либо задумывались о том, как создать свой собственный язык программирования, эта книга для вас.
Всего за несколько строк кода я научу вас использовать C, и вместе мы начнем создавать ваш собственный язык.
По пути мы узнаем о странной и удивительной природе Lisp, как развивать реальный проект, лаконично решать задачи и писать красивый код!
Эту книгу можно бесплатно прочитать онлайн, так что вы можете начать прямо сейчас! Но для тех, кто хочет выразить свою поддержку или получить лучший опыт чтения, книга также доступна для покупки в печатном формате или недорого в основных электронных форматах.
https://www.buildyourownlisp.com/contents
#cpp
👉 @bookflow
❤3👍2🔥2
Самый быстрый и безопасный PNG декодер в мире
TL;DR: декодер изображений PNG из стандартной библиотеки языка программирования Wuffs работает в 1.22–2.75 раза быстрее, чем libpng (широко используемая реализация PNG декодера на C с открытым исходным кодом), C-библиотеки libspng, lodepng и stb_image, а также самые популярные библиотеки для работы с PNG на Go и Rust.
Декодирование PNG с помощью Wuffs обсуждалось на Hacker News №1, Hacker News №2, /r/programming, /r/rust и lobste.rs.
https://habr.com/ru/articles/751462/
#cpp
👉 @bookflow
TL;DR: декодер изображений PNG из стандартной библиотеки языка программирования Wuffs работает в 1.22–2.75 раза быстрее, чем libpng (широко используемая реализация PNG декодера на C с открытым исходным кодом), C-библиотеки libspng, lodepng и stb_image, а также самые популярные библиотеки для работы с PNG на Go и Rust.
Декодирование PNG с помощью Wuffs обсуждалось на Hacker News №1, Hacker News №2, /r/programming, /r/rust и lobste.rs.
https://habr.com/ru/articles/751462/
#cpp
👉 @bookflow
👍2