Media is too big
VIEW IN TELEGRAM
DevSecOps for C++? Keep Calm and use Conan
Luis Caro Campos - CppCon 2024
How Conan can help secure your software supply chain
источник
#cpp #programming
👉 @cpp_lib
Luis Caro Campos - CppCon 2024
How Conan can help secure your software supply chain
источник
#cpp #programming
👉 @cpp_lib
⁉️ Хотите научиться разрабатывать веб-сервисы на Rust?
📅 19 мая в 20:00 МСК на открытом вебинаре мы покажем, как создать мощный и эффективный веб-сервис с использованием HTTP и gRPC API на Rust.
Что вас ждёт:
— Разбор бизнес-логики веб-сервиса.
— Реализация HTTP и gRPC API.
— Разработка клиентского приложения и тестов для сервиса.
🎁 Открытый урок проходит в преддверие старта курса «Rust Developer. Professional». Все участники получат скидку на обучение.
➡️ Запишитесь прямо сейчас, чтобы не пропустить: https://vk.cc/cLTcXQ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
📅 19 мая в 20:00 МСК на открытом вебинаре мы покажем, как создать мощный и эффективный веб-сервис с использованием HTTP и gRPC API на Rust.
Что вас ждёт:
— Разбор бизнес-логики веб-сервиса.
— Реализация HTTP и gRPC API.
— Разработка клиентского приложения и тестов для сервиса.
🎁 Открытый урок проходит в преддверие старта курса «Rust Developer. Professional». Все участники получат скидку на обучение.
➡️ Запишитесь прямо сейчас, чтобы не пропустить: https://vk.cc/cLTcXQ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Как я написал эмулятор Nintendo Gameboy на C++ за две недели
Расскажу, как устроена архитектура консоли Nintendo Gameboy, как можно эмулировать её основные компоненты, какие решения я принимал в процессе разработки и какие инструменты использовал.
В свободное время, (прим., во время отпуска) я бывает берусь за какие-нибудь небольшие проекты не связанные с моей основной деятельностью. В этот раз решил создать эмулятор консоли. Вопреки моде на Rust, взял проверенный годами C++. Эмуляция — непростая задача. Производители редко публикуют полные спецификации аппаратной части, поэтому сообщество занимается восстановлением поведения системы по косвенным признакам и тестированию. Полное решение таких задач требует больше времени, чем пара недель отпуска. В условиях жестких временных рамок, желания получить быстрый результат я остановился на эмуляции Nintento Gameboy. Активное сообщество, популярность и долгая жизнь консоли привели к появлению огромного количества открытых ресурсов, которые делают возможным получить быстрый и наглядный результат. Например, на archive.org доступно руководство разработчика (GameBoyProgManVer1.1), а поиск по Github даёт более 8000 репозиториев, так или иначе связанных с данной консолью.
https://habr.com/ru/articles/908752/
#cpp #programming
👉 @cpp_lib
Расскажу, как устроена архитектура консоли Nintendo Gameboy, как можно эмулировать её основные компоненты, какие решения я принимал в процессе разработки и какие инструменты использовал.
В свободное время, (прим., во время отпуска) я бывает берусь за какие-нибудь небольшие проекты не связанные с моей основной деятельностью. В этот раз решил создать эмулятор консоли. Вопреки моде на Rust, взял проверенный годами C++. Эмуляция — непростая задача. Производители редко публикуют полные спецификации аппаратной части, поэтому сообщество занимается восстановлением поведения системы по косвенным признакам и тестированию. Полное решение таких задач требует больше времени, чем пара недель отпуска. В условиях жестких временных рамок, желания получить быстрый результат я остановился на эмуляции Nintento Gameboy. Активное сообщество, популярность и долгая жизнь консоли привели к появлению огромного количества открытых ресурсов, которые делают возможным получить быстрый и наглядный результат. Например, на archive.org доступно руководство разработчика (GameBoyProgManVer1.1), а поиск по Github даёт более 8000 репозиториев, так или иначе связанных с данной консолью.
https://habr.com/ru/articles/908752/
#cpp #programming
👉 @cpp_lib
Любителям x86-64 assembler посвящается: DIY волокна в C++
Нас ждёт мозговыносящая смесь 64/32-битного ассемблера и старого-доброго C++. Мы сделаем собственную реализацию... Волокон (fibers) без вызова Win API и звонков в службу спасения.
https://habr.com/ru/articles/908406/
👉 @cpp_lib
Нас ждёт мозговыносящая смесь 64/32-битного ассемблера и старого-доброго C++. Мы сделаем собственную реализацию... Волокон (fibers) без вызова Win API и звонков в службу спасения.
https://habr.com/ru/articles/908406/
👉 @cpp_lib
C++26:
В C++26 мы, наконец, сможем использовать
Предыстория
В C++11 впервые появилась возможность помечать функции как
Со временем, с расширением возможностей
Что изменилось в C++26
C++26 снимает запрет на
Теперь можно:
* использовать
* обрабатывать исключения с помощью
* компилятор по-прежнему выдаёт ошибку, если
Пример
Теперь это разрешено! Но:
А вот во время выполнения:
Зачем это нужно?
Это изменение делает
Кроме того, это упрощает написание универсальных библиотек и работу с шаблонным кодом, где невозможно заранее предсказать, будет ли функция использоваться во время компиляции или выполнения.
https://www.sandordargo.com/blog/2025/05/07/cpp26-constexpr-exceptions
#cpp #programming
👉 @cpp_lib
constexpr
и исключенияВ C++26 мы, наконец, сможем использовать
throw
в constexpr
функциях!Предыстория
В C++11 впервые появилась возможность помечать функции как
constexpr
, что позволяло выполнять их на этапе компиляции. Однако с самого начала были ограничения: такие функции не могли содержать try/catch
и throw
. Это было связано с тем, что исключения в constexpr
контексте раньше просто не имели смысла: выполнение либо происходило на этапе компиляции, либо завершалось ошибкой компиляции.Со временем, с расширением возможностей
constexpr
, начали возникать ситуации, когда throw
внутри constexpr
функций стал бы полезен. Особенно это касалось шаблонного кода и библиотек общего назначения, где отказ от throw
усложнял реализацию.Что изменилось в C++26
C++26 снимает запрет на
throw
в constexpr
функциях.Теперь можно:
* использовать
throw
в constexpr
функциях;* обрабатывать исключения с помощью
try/catch
(при выполнении во время выполнения, а не компиляции);* компилятор по-прежнему выдаёт ошибку, если
throw
вызывается при вычислении на этапе компиляции.Пример
constexpr int might_throw(bool should_throw) {
if (should_throw) {
throw std::runtime_error("Oops");
}
return 42;
}
Теперь это разрешено! Но:
constexpr int x = might_throw(true); // Ошибка компиляции
constexpr int y = might_throw(false); // Ок, y == 42
А вот во время выполнения:
int main() {
try {
std::cout << might_throw(true); // Бросает исключение
} catch (const std::exception& e) {
std::cout << e.what(); // "Oops"
}
}
Зачем это нужно?
Это изменение делает
constexpr
функции более универсальными и приближает их к обычным функциям. Оно открывает путь к более выразительному коду, где одни и те же функции могут использоваться и на этапе компиляции, и во время выполнения без необходимости создавать дублирующие версии.Кроме того, это упрощает написание универсальных библиотек и работу с шаблонным кодом, где невозможно заранее предсказать, будет ли функция использоваться во время компиляции или выполнения.
https://www.sandordargo.com/blog/2025/05/07/cpp26-constexpr-exceptions
#cpp #programming
👉 @cpp_lib
Визуализация быстрой сортировки с SFML и C++20
В этой статье мы создадим интерактивную визуализацию алгоритма быстрой сортировки (QuickSort) с использованием библиотеки SFML и современных возможностей C++20. Этот проект поможет вам лучше понять, как работает один из самых популярных алгоритмов сортировки, и покажет, как можно комбинировать графику и алгоритмы для создания образовательных инструментов.
https://habr.com/ru/articles/889188/
#cpp #programming
👉 @cpp_lib
В этой статье мы создадим интерактивную визуализацию алгоритма быстрой сортировки (QuickSort) с использованием библиотеки SFML и современных возможностей C++20. Этот проект поможет вам лучше понять, как работает один из самых популярных алгоритмов сортировки, и покажет, как можно комбинировать графику и алгоритмы для создания образовательных инструментов.
https://habr.com/ru/articles/889188/
#cpp #programming
👉 @cpp_lib
⚡️Готовы повысить квалификацию и стать востребованным профи в C++?
Курс «C++ Developer. Professional» — идеальный выбор для разработчиков, которые уже знакомы с языком и хотят выйти на новый уровень. Вы освоите принципы многопоточного программирования, работу с новыми стандартами C++ 20 и 23, а также научитесь эффективно взаимодействовать с сетью и обрабатывать большие объемы данных. Интересные кейсы и 14 практических работ помогут закрепить знания и подготовиться к реальным задачам.
С обучением от OTUS вы получите глубокое понимание C++, научитесь проектировать масштабируемые решения и писать чистый, эффективный код. После завершения курса у вас будет прочная база для роста и карьерного продвижения в крупнейших IT-компаниях.
👉Пройдите вступительное тестирование и получите скидку на обучение: https://vk.cc/cM8B48
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Курс «C++ Developer. Professional» — идеальный выбор для разработчиков, которые уже знакомы с языком и хотят выйти на новый уровень. Вы освоите принципы многопоточного программирования, работу с новыми стандартами C++ 20 и 23, а также научитесь эффективно взаимодействовать с сетью и обрабатывать большие объемы данных. Интересные кейсы и 14 практических работ помогут закрепить знания и подготовиться к реальным задачам.
С обучением от OTUS вы получите глубокое понимание C++, научитесь проектировать масштабируемые решения и писать чистый, эффективный код. После завершения курса у вас будет прочная база для роста и карьерного продвижения в крупнейших IT-компаниях.
👉Пройдите вступительное тестирование и получите скидку на обучение: https://vk.cc/cM8B48
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
📚 Мини-справочник по основным типам данных C++
Делимся компактным справочником по основным типам данных в C++. Сохраняйте себе на будущее.
🔢 Целочисленные типы
• int — 4 байта, от -2,147,483,648 до 2,147,483,647
• short — 2 байта, от -32,768 до 32,767
• long — 4 байта (Windows) или 8 байт (Unix)
• long long — 8 байт, от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807
Модификаторы:
• unsigned — только положительные числа, удваивает верхний предел
• signed — со знаком (по умолчанию)
🔡 Символьные типы
• char — 1 байт, обычные символы ASCII
• wchar_t — 2 или 4 байта, широкие символы (Unicode)
• char16_t — 2 байта, символы UTF-16 (C++11)
• char32_t — 4 байта, символы UTF-32 (C++11)
🔄 Числа с плавающей точкой
• float — 4 байта, точность ~7 цифр, диапазон ±3.4e±38
• double — 8 байт, точность ~15 цифр, диапазон ±1.7e±308
• long double — 8-16 байт, точность ≥ double, диапазон зависит от компилятора
🧮 Логический тип
• bool — 1 байт, значения: true или false
🗄 Производные типы
• Массивы:
• Указатели:
• Ссылки:
• Строки:
• C-строки:
• std::string:
🔄 Автоматическое определение типа (C++11)
🧩 Тип Void
• void — отсутствие типа (для функций без возвращаемого значения)
• void* — указатель на данные любого типа
🔍 Как узнать размер типа
💡 Полезные советы
1. Используйте **size_t для индексации и размеров
2. Для целых чисел с гарантированным размером используйте типы из
3. Для денежных расчетов избегайте float из-за погрешностей округления
#cpp #programming
👉 @cpp_lib
Делимся компактным справочником по основным типам данных в C++. Сохраняйте себе на будущее.
🔢 Целочисленные типы
• int — 4 байта, от -2,147,483,648 до 2,147,483,647
• short — 2 байта, от -32,768 до 32,767
• long — 4 байта (Windows) или 8 байт (Unix)
• long long — 8 байт, от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807
Модификаторы:
• unsigned — только положительные числа, удваивает верхний предел
• signed — со знаком (по умолчанию)
unsigned int counter = 100;
short temperature = -15;
long long population = 7800000000;
🔡 Символьные типы
• char — 1 байт, обычные символы ASCII
• wchar_t — 2 или 4 байта, широкие символы (Unicode)
• char16_t — 2 байта, символы UTF-16 (C++11)
• char32_t — 4 байта, символы UTF-32 (C++11)
char letter = 'A';
wchar_t unicodeChar = L'Ф';
char16_t utf16Char = u'Ж';
🔄 Числа с плавающей точкой
• float — 4 байта, точность ~7 цифр, диапазон ±3.4e±38
• double — 8 байт, точность ~15 цифр, диапазон ±1.7e±308
• long double — 8-16 байт, точность ≥ double, диапазон зависит от компилятора
float price = 19.99f; // 'f' суффикс для float
double pi = 3.14159265359;
long double precise = 1.23456789123456789L; // 'L' суффикс
🧮 Логический тип
• bool — 1 байт, значения: true или false
bool isActive = true;
bool hasPermission = false;
🗄 Производные типы
• Массивы:
int numbers[5];
• Указатели:
int* ptr;
• Ссылки:
int& ref = value;
• Строки:
• C-строки:
char str[] = "Hello";
• std::string:
std::string text = "Hello";
🔄 Автоматическое определение типа (C++11)
auto x = 10; // int
auto y = 3.14; // double
auto z = "Hello"; // const char*
🧩 Тип Void
• void — отсутствие типа (для функций без возвращаемого значения)
• void* — указатель на данные любого типа
🔍 Как узнать размер типа
cout << "Размер int: " << sizeof(int) << " байт" << endl;
💡 Полезные советы
1. Используйте **size_t для индексации и размеров
2. Для целых чисел с гарантированным размером используйте типы из
<cstdint>
: int32_t, uint64_t3. Для денежных расчетов избегайте float из-за погрешностей округления
#cpp #programming
👉 @cpp_lib
FFI: как создать мост между Rust и C/C++
Сегодня мы рассмотрим, как создать безопасные FFI-интерфейсы в Rust для интеграции с C/C++ библиотеками
Если говорить проще, FFI (foreign function interface — интерфейс вызова внешних функций) – это способ «позаимствовать» функциональность из другого языка. В контексте нашей статьи, с одной стороны у нас Rust, где каждый байт памяти охраняется компилятором, а на другой C++, где свобода обращения с памятью может обернуться утечками или, что еще хуже, непредсказуемым UB (англ. undefined behavior, в ряде источников неопределенное поведение). И наша задача – сделать так, чтобы эти два мира не конфликтовали, а работали в унисон.
https://habr.com/ru/companies/mvideo/articles/892926/
#cpp #programming
👉 @cpp_lib
Сегодня мы рассмотрим, как создать безопасные FFI-интерфейсы в Rust для интеграции с C/C++ библиотеками
Если говорить проще, FFI (foreign function interface — интерфейс вызова внешних функций) – это способ «позаимствовать» функциональность из другого языка. В контексте нашей статьи, с одной стороны у нас Rust, где каждый байт памяти охраняется компилятором, а на другой C++, где свобода обращения с памятью может обернуться утечками или, что еще хуже, непредсказуемым UB (англ. undefined behavior, в ряде источников неопределенное поведение). И наша задача – сделать так, чтобы эти два мира не конфликтовали, а работали в унисон.
https://habr.com/ru/companies/mvideo/articles/892926/
#cpp #programming
👉 @cpp_lib
🔐 Основы сжатия данных: создаем RLE архиватор
Приглашаем на открытый урок.
🗓 28 мая в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Алгоритмы и структуры данных».
На этом вебинаре мы начнем создавать собственный архиватор на Java. Разработаем базовую структуру программы с пользовательским интерфейсом и реализуем алгоритм RLE (кодирование длин серий) для сжатия данных. Изучим как базовую, так и улучшенную версию RLE.
Протестируем эффективность алгоритма на разных типах файлов и увидим, когда этот простой метод сжатия работает наиболее эффективно.
Практическое погружение в мир алгоритмов сжатия данных для всех, кто интересуется программированием и структурами данных.
🎁 Всем участникам вебинара дарим промокод, который дает скидку на обучение - Algo5
👉 Регистрация на вебинар: https://vk.cc/cMaE9C
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Приглашаем на открытый урок.
🗓 28 мая в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Алгоритмы и структуры данных».
На этом вебинаре мы начнем создавать собственный архиватор на Java. Разработаем базовую структуру программы с пользовательским интерфейсом и реализуем алгоритм RLE (кодирование длин серий) для сжатия данных. Изучим как базовую, так и улучшенную версию RLE.
Протестируем эффективность алгоритма на разных типах файлов и увидим, когда этот простой метод сжатия работает наиболее эффективно.
Практическое погружение в мир алгоритмов сжатия данных для всех, кто интересуется программированием и структурами данных.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Какой твой любимый аспект работы с C++?
Для меня лично — это невероятная свобода и контроль, которые он даёт. Я ещё ни разу не сталкивался с тем, чтобы язык сказал мне: «нет, так нельзя». И это, на мой взгляд, делает процесс куда более увлекательным. Возникает ощущение, что ты действительно продумываешь свои решения и делаешь их максимально подходящими под себя.
А что тебе больше всего нравится? Пиши в комменты 👇
#cpp #programming
👉 @cpp_lib
Для меня лично — это невероятная свобода и контроль, которые он даёт. Я ещё ни разу не сталкивался с тем, чтобы язык сказал мне: «нет, так нельзя». И это, на мой взгляд, делает процесс куда более увлекательным. Возникает ощущение, что ты действительно продумываешь свои решения и делаешь их максимально подходящими под себя.
А что тебе больше всего нравится? Пиши в комменты 👇
#cpp #programming
👉 @cpp_lib
Media is too big
VIEW IN TELEGRAM
Логика коэволюции компиляторов, инструментов разработки и языков программирования.
Выступление в институте iSpring 17 мая 2025 года. Огромная благодарность организаторам за приглашение и за разрешение выложить запись на моём канале.
В этой лекции мы поднимемся от самого нижнего уровня -- отдельных транзисторов до высокоуровневых языков программирования и проследим совместное развитие механизмов абстракции и инструментов разработки.
00:00 Начало: бинарные цифровые компьютеры
06:00 Мнемоническое представление и проблемы двоичного кода
14:10 Релокации и изобретение линкера
17:25 Язык ассемблера, секции и ассемблер как программа
24:30 Дизассемблер.
30:25 ABI и соглашения о вызове
35:35 Библиотеки
40:55 Проблемы ассемблера
48:10 Алгоритмические языки и компиляторы
54:45 Компилятор и его ограничения
01:03:40 Оптимизации в бэкенеде: inline и LTO
01:15:00 Гарантии по именам и механизмы абстракции
01:19:55 Завершение: абстракции не случайны
источник
#cpp #programming
👉 @cpp_lib
Выступление в институте iSpring 17 мая 2025 года. Огромная благодарность организаторам за приглашение и за разрешение выложить запись на моём канале.
В этой лекции мы поднимемся от самого нижнего уровня -- отдельных транзисторов до высокоуровневых языков программирования и проследим совместное развитие механизмов абстракции и инструментов разработки.
00:00 Начало: бинарные цифровые компьютеры
06:00 Мнемоническое представление и проблемы двоичного кода
14:10 Релокации и изобретение линкера
17:25 Язык ассемблера, секции и ассемблер как программа
24:30 Дизассемблер.
30:25 ABI и соглашения о вызове
35:35 Библиотеки
40:55 Проблемы ассемблера
48:10 Алгоритмические языки и компиляторы
54:45 Компилятор и его ограничения
01:03:40 Оптимизации в бэкенеде: inline и LTO
01:15:00 Гарантии по именам и механизмы абстракции
01:19:55 Завершение: абстракции не случайны
источник
#cpp #programming
👉 @cpp_lib
🧑🏻💻Хотите быть в курсе новейших возможностей C++? Откройте для себя самые актуальные фичи C++20 и C++23, которые сделают вашу работу с кодом проще и эффективнее.
На открытом вебинаре мы подробно разберем ключевые нововведения языка — от концептов и модулей до рендж-адаптеров и улучшений в форматировании. Вы научитесь использовать новейшие инструменты для повышения производительности и улучшения архитектуры ваших проектов.
Применяя концепты, ограничения и модули, вы сможете писать более читаемый и обобщенный код, который соответствует последним стандартам C++. Эти навыки помогут вам работать с современными абстракциями и значительно повысить эффективность кода.
👉Пройдите открытый урок в преддверие старта курса «C++ Developer. Professional» и получите скидку на обучение! Присоединяйтесь 27 мая в 20:00 МСК и откройте для себя мир возможностей C++: https://vk.cc/cMcszJ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
На открытом вебинаре мы подробно разберем ключевые нововведения языка — от концептов и модулей до рендж-адаптеров и улучшений в форматировании. Вы научитесь использовать новейшие инструменты для повышения производительности и улучшения архитектуры ваших проектов.
Применяя концепты, ограничения и модули, вы сможете писать более читаемый и обобщенный код, который соответствует последним стандартам C++. Эти навыки помогут вам работать с современными абстракциями и значительно повысить эффективность кода.
👉Пройдите открытый урок в преддверие старта курса «C++ Developer. Professional» и получите скидку на обучение! Присоединяйтесь 27 мая в 20:00 МСК и откройте для себя мир возможностей C++: https://vk.cc/cMcszJ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Расширенные клиентские области и безопасные зоны
Классикой современного дизайна приложений на настольных и мобильных платформах является то, что содержимое находится в центре внимания — элементы интерфейса приложения и системы органично вписываются в контент, не отвлекая пользователя. В Qt 6.9 появились две новые возможности, которые помогают достичь этого: расширенные клиентские области и безопасные зоны.
Расширенные клиентские области
Предположим, мы создаём приложение для любителей собак, в котором показываем наши любимые фотографии. Минимальный пример приложения может выглядеть так:
Это даёт нам следующее на macOS и iOS: наша собака в центре внимания. Но есть несколько элементов интерфейса, которые конкурируют за наше внимание — заголовок окна и элементы управления на macOS; а также часы, Wi-Fi и индикатор батареи на iOS. Мы можем сделать лучше!
Добавив флаг окна
Чтобы скрыть заголовок окна на macOS, мы также используем
Безопасные зоны
Однако с расширением клиентской области возникают и новые обязанности. Теперь наше приложение борется за тот же экранный простор, что и системный интерфейс, и система обычно побеждает. Это значит, что важно не размещать важный контент в областях, где он может быть перекрыт элементами системы.
Например, мы можем захотеть добавить кнопки для взаимодействия с собакой, пока нас нет:
Но это будет конфликтовать с системным интерфейсом на macOS и iOS. Чтобы избежать этого, мы используем новое присоединённое свойство
Это надёжно размещает кнопки ниже заголовка окна на macOS и внизу экрана на iOS, учитывая все ориентации экрана.
Qt Quick Controls
До сих пор мы использовали обычное окно
Взгляд в будущее
Мы надеемся, что эти изменения в Qt 6.9 помогут внедрять современные UI-подходы в ваших приложениях. Функции уже доступны и поддерживаются на macOS, Windows, iOS, visionOS и Android, а в будущем мы планируем расширить поддержку на другие платформы. По умолчанию на некоторых платформах, таких как Android и iOS, флаг
https://www.qt.io/blog/expanded-client-areas-and-safe-areas-in-qt-6.9
#cpp #programming
👉 @cpp_lib
Классикой современного дизайна приложений на настольных и мобильных платформах является то, что содержимое находится в центре внимания — элементы интерфейса приложения и системы органично вписываются в контент, не отвлекая пользователя. В Qt 6.9 появились две новые возможности, которые помогают достичь этого: расширенные клиентские области и безопасные зоны.
Расширенные клиентские области
Предположим, мы создаём приложение для любителей собак, в котором показываем наши любимые фотографии. Минимальный пример приложения может выглядеть так:
import QtQuick
Window {
visible: true
width: 800; height: 600
Image {
anchors.fill: parent
source: "https://placedog.net/800/600?r"
fillMode: Image.PreserveAspectCrop
}
}
Это даёт нам следующее на macOS и iOS: наша собака в центре внимания. Но есть несколько элементов интерфейса, которые конкурируют за наше внимание — заголовок окна и элементы управления на macOS; а также часы, Wi-Fi и индикатор батареи на iOS. Мы можем сделать лучше!
Добавив флаг окна
Qt.ExpandedClientAreaHint
, мы просим расширить клиентскую область окна в те зоны, которые обычно зарезервированы для системного интерфейса:
Window {
flags: Qt.ExpandedClientAreaHint | Qt.NoTitleBarBackgroundHint
// ...
}
Чтобы скрыть заголовок окна на macOS, мы также используем
Qt.NoTitleBarBackgroundHint
. В результате содержимое растягивается по всему экрану, полностью фокусируя внимание на нашей собаке.Безопасные зоны
Однако с расширением клиентской области возникают и новые обязанности. Теперь наше приложение борется за тот же экранный простор, что и системный интерфейс, и система обычно побеждает. Это значит, что важно не размещать важный контент в областях, где он может быть перекрыт элементами системы.
Например, мы можем захотеть добавить кнопки для взаимодействия с собакой, пока нас нет:
Window {
// ...
Item {
anchors {
left: parent.left; right: parent.right; top: parent.top
margins: 10
}
Text {
text: "Throw Ball"; color: "white"; font.pointSize: 18
anchors.left: parent.left
}
Text {
text: "Give Bone"; color: "white"; font.pointSize: 18
anchors.right: parent.right
}
}
}
Но это будет конфликтовать с системным интерфейсом на macOS и iOS. Чтобы избежать этого, мы используем новое присоединённое свойство
SafeArea
, которое сообщает, насколько нужно отступить содержимое от «небезопасных» зон окна:
anchors {
left: parent.left; right: parent.right; top: parent.top
topMargin: 10 + parent.SafeArea.margins.top
leftMargin: 10 + parent.SafeArea.margins.left
rightMargin: 10 + parent.SafeArea.margins.right
}
Это надёжно размещает кнопки ниже заголовка окна на macOS и внизу экрана на iOS, учитывая все ориентации экрана.
Qt Quick Controls
До сих пор мы использовали обычное окно
Window
, но в реальности вы, скорее всего, будете применять ApplicationWindow
из Qt Quick Controls, который уже включает поддержку безопасных зон. При установке флага Qt.ExpandedClientAreaHint
фон окна автоматически растягивается на всю область, а содержимое остаётся внутри безопасных зон. Для таких элементов, как ToolBar
и MenuBar
, предусмотрена автоматическая подстройка фона и содержимого под безопасные зоны.Взгляд в будущее
Мы надеемся, что эти изменения в Qt 6.9 помогут внедрять современные UI-подходы в ваших приложениях. Функции уже доступны и поддерживаются на macOS, Windows, iOS, visionOS и Android, а в будущем мы планируем расширить поддержку на другие платформы. По умолчанию на некоторых платформах, таких как Android и iOS, флаг
Qt.ExpandedClientAreaHint
может быть включён автоматически. Пожалуйста, протестируйте новые возможности и сообщите нам о любых проблемах или неудовлетворённых сценариях использования.https://www.qt.io/blog/expanded-client-areas-and-safe-areas-in-qt-6.9
#cpp #programming
👉 @cpp_lib
Media is too big
VIEW IN TELEGRAM
Сергей Добычин — constexpr-аллокатор для контейнеров стандартной библиотеки
Одна из главных фич, которая выделяет С++ среди других языков — константные вычисления. С каждым новым стандартом языка поддержка константных вычислений становится все более продвинутой.
В С++ 20 появились аллокации памяти в constexpr-выражениях, и стало возможным использовать std::vector и std::string в константных выражениях.
Но есть одно но: использовать их можно только внутри constexpr, из constexpr-функции нельзя вернуть std::string или std::vector.
В докладе рассмотрели, как, используя только лишь возможности С++23, написать аллокатор, с помощью которого можно реализовать top-level constexpr std::string, std::vector и остальные контейнеры стандартной библиотеки.
2:55 Начало. Transient выделения памяти при компиляции. Невозможность non-transient в C++
8:45 Подробный разбор предложения P0639 по CE аллокатору
11:30 Проблемы с размером буфера
18:16 Двухэтапное определения размера буфера во время компиляции
20:40 Постановка задачи: как сделать чтобы CE аллокатор сам определял размер буфера? Общий вид решения.
23:13 Интересные детали реализации
27:45 Передача инициализирующего значения через типы (разбор P2781)
31:20 Завершение: QR код на полное решение в C++20 и примеры
34:08 Вопросы
источник
#cpp #programming
👉 @cpp_lib
Одна из главных фич, которая выделяет С++ среди других языков — константные вычисления. С каждым новым стандартом языка поддержка константных вычислений становится все более продвинутой.
В С++ 20 появились аллокации памяти в constexpr-выражениях, и стало возможным использовать std::vector и std::string в константных выражениях.
Но есть одно но: использовать их можно только внутри constexpr, из constexpr-функции нельзя вернуть std::string или std::vector.
В докладе рассмотрели, как, используя только лишь возможности С++23, написать аллокатор, с помощью которого можно реализовать top-level constexpr std::string, std::vector и остальные контейнеры стандартной библиотеки.
2:55 Начало. Transient выделения памяти при компиляции. Невозможность non-transient в C++
8:45 Подробный разбор предложения P0639 по CE аллокатору
11:30 Проблемы с размером буфера
18:16 Двухэтапное определения размера буфера во время компиляции
20:40 Постановка задачи: как сделать чтобы CE аллокатор сам определял размер буфера? Общий вид решения.
23:13 Интересные детали реализации
27:45 Передача инициализирующего значения через типы (разбор P2781)
31:20 Завершение: QR код на полное решение в C++20 и примеры
34:08 Вопросы
источник
#cpp #programming
👉 @cpp_lib
Как сделать код удобным для чтения и поддержки? Как стиль и форматирование могут улучшить командную работу?
⏺️ На открытом вебинаре мы подробно разберем, почему читаемость и поддерживаемость кода — важные элементы успешных проектов. Мы покажем, как правильное именование переменных, методов и классов помогает сделать код понятным для всей команды. Также мы объясним, как выравнивание, отступы и оформление скобок влияют на восприятие кода.
Вы научитесь:
▸ Настраивать автоматическое форматирование,
▸ Использовать линтеры и анализаторы,
▸ Внедрять Code Style соглашения в команде.
▸ Сократите время на ревью и отладку, повысив качество проектов!
Посетите открытый урок в преддверии старта курса «C++ Developer»!
🔴 Встречаемся 29 мая в 20:00 МСК.
Регистрация открыта: https://vk.cc/cMiJ9H
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
⏺️ На открытом вебинаре мы подробно разберем, почему читаемость и поддерживаемость кода — важные элементы успешных проектов. Мы покажем, как правильное именование переменных, методов и классов помогает сделать код понятным для всей команды. Также мы объясним, как выравнивание, отступы и оформление скобок влияют на восприятие кода.
Вы научитесь:
▸ Настраивать автоматическое форматирование,
▸ Использовать линтеры и анализаторы,
▸ Внедрять Code Style соглашения в команде.
▸ Сократите время на ревью и отладку, повысив качество проектов!
Посетите открытый урок в преддверии старта курса «C++ Developer»!
🔴 Встречаемся 29 мая в 20:00 МСК.
Регистрация открыта: https://vk.cc/cMiJ9H
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
🧑💻 C++ шпаргалка
🔹 Основы синтаксиса:
Комментарии:
🔹 Ввод/вывод:
🔹 Типы данных:
🔹 Условия и циклы:
🔹 Функции:
🔹 Массивы и векторы:
🔹 Стандартные библиотеки:
🔹 STL:
Векторы, карты, множества, строки, стек и очередь
📎 Подробнее: https://www.geeksforgeeks.org/cpp-cheatsheet/
#cpp #programming
👉 @cpp_lib
🔹 Основы синтаксиса:
int main() { ... }
Комментарии:
// однострочный
или /* многострочный */
🔹 Ввод/вывод:
cin >> x;
— вводcout << x;
— вывод🔹 Типы данных:
int, float, double, char, bool, string
🔹 Условия и циклы:
if, else, switch
for, while, do-while
🔹 Функции:
returnType name(args) { ... }
🔹 Массивы и векторы:
int arr[10];
vector<int> v;
🔹 Стандартные библиотеки:
#include <iostream>
#include <vector>
#include <algorithm>
🔹 STL:
Векторы, карты, множества, строки, стек и очередь
📎 Подробнее: https://www.geeksforgeeks.org/cpp-cheatsheet/
#cpp #programming
👉 @cpp_lib
🚀 Открой для себя идеальный путь к лидерству с карьерным тестом от ОЭЗ «Алабуга»! 🌟
Мечтаете о карьере в крупной компании, где ваш потенциал раскроется на полную? Наш тест поможет вам определить вашу уникальную лидерскую роль. Может быть, именно вы станете тем лидером, который выведет команду на новый уровень?
После прохождения теста вы можете заполнить заявку и получить приглашение на эксклюзивную лидерскую программу. Участие в программе открывает реальные перспективы трудоустройства в ОЭЗ «Алабуга», предоставляя шанс начать путь к профессиональному признанию.
Сделайте первый шаг к своему будущему сегодня! Пройдите тест, подайте заявку и начните строить свою карьеру вместе с нами. 🎯
Мечтаете о карьере в крупной компании, где ваш потенциал раскроется на полную? Наш тест поможет вам определить вашу уникальную лидерскую роль. Может быть, именно вы станете тем лидером, который выведет команду на новый уровень?
После прохождения теста вы можете заполнить заявку и получить приглашение на эксклюзивную лидерскую программу. Участие в программе открывает реальные перспективы трудоустройства в ОЭЗ «Алабуга», предоставляя шанс начать путь к профессиональному признанию.
Сделайте первый шаг к своему будущему сегодня! Пройдите тест, подайте заявку и начните строить свою карьеру вместе с нами. 🎯
В libc добавляют size-based vector в unstable ABI
На форуме LLVM обсуждается важное предложение — добавить новый вектор, основанный на размере (size-based vector), в нестабильный ABI библиотеки libc.
⠀
Ключевые моменты:
— Новый тип vector оптимизирован под размер и производительность
— Идея — упростить работу с контейнерами и повысить эффективность стандартных операций
— Обсуждается, как это повлияет на совместимость и что потребуется для поддержки этого нововведения в экосистеме
https://discourse.llvm.org/t/adding-a-size-based-vector-to-libc-s-unstable-abi/86306
#cpp #programming
👉 @cpp_lib
На форуме LLVM обсуждается важное предложение — добавить новый вектор, основанный на размере (size-based vector), в нестабильный ABI библиотеки libc.
⠀
Ключевые моменты:
— Новый тип vector оптимизирован под размер и производительность
— Идея — упростить работу с контейнерами и повысить эффективность стандартных операций
— Обсуждается, как это повлияет на совместимость и что потребуется для поддержки этого нововведения в экосистеме
https://discourse.llvm.org/t/adding-a-size-based-vector-to-libc-s-unstable-abi/86306
#cpp #programming
👉 @cpp_lib