C++ Academy
14.3K subscribers
340 photos
111 videos
1 file
348 links
По всем вопросам- @haarrp
Download Telegram
🖥 Некоторые тонкости генерации случайных чисел в C++

C и C++ имеют свои собственные встроенные генераторы случайных чисел. Они реализованы в двух отдельных функциях, которые находятся в заголовочном файле cstdlib:

srand() устанавливает передаваемое пользователем значение в качестве стартового. srand() следует вызывать только один раз — в начале программы (обычно в верхней части функции main())

rand() генерирует следующее случайное число в последовательности. Оно будет находиться в диапазоне от 0 до RAND_MAX (константа в cstdlib, значением которой является 32767).

Вот пример программы, в которой используются обе эти функции:
#include <iostream>
#include <cstdlib> // для функций rand() и srand()

int main()
{
srand(4541); // устанавливаем стартовое значение - 4 541

// Выводим 100 случайных чисел
for (int count=0; count < 100; ++count)
{
std::cout << rand() << "\t";

// Если вывели 5 чисел, то вставляем символ новой строки
if ((count+1) % 5 == 0)
std::cout << "\n";
}
}

// 14867 24680 8872 25432 21865
// ...



Рандомные числа в C++ 11

В C++ 11 добавили тонну нового функционала для генерации случайных чисел, включая алгоритм Вихрь Мерсенна, а также разные виды генераторов случайных чисел (например, равномерные, генератор Poisson и пр.). Доступ к ним осуществляется через подключение заголовочного файла random.

Вот пример генерации случайных чисел в C++11 с использованием Вихря Мерсенна на картинке.

Вихрь Мерсенна генерирует случайные 32-битные целые числа unsigned (а не 15-битные целые числа, как в случае с rand()), что позволяет использовать гораздо больший диапазон значений.
Существует также версия (std::mt19937_64) для генерации 64-битных целых чисел unsigned

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Дискуссия об использовании языка C++ для разработки ядра Linux

В списке рассылки разработчиков ядра Linux возобновилось начатое шесть лет назад обсуждение перспектив использования современного кода на C++ в ядре Linux, помимо нынешнего применения языка Си с ассемблерными вставками и продвижения языка Rust. Изначально тема разработки ядра на C++ была поднята в 2018 году инженером из Red Hat, который первого апреля в качестве шутки опубликовал набор из 45 патчей для использования шаблонов, наследуемых классов и перегрузки функций C++ в коде ядра.

С инициативой продолжения обсуждения выступил Ганс Питер Анвин, один из ключевых разработчиков ядра в компании Intel. По мнению Анвина, который является автором многочисленных макросов и ассемблерных вставок в ядре, с 1999 года языки C и C++ значительно продвинулись вперёд в своём развитии и язык C++ стал лучше, чем С, подходить для разработки ядра операционных систем.

Возможности, для которых ещё недавно приходилось привлекать специфичные GCC-расширения, теперь легко реализовать на стандартном C++, и во многих случаях использование C++ позволит улучшить инфраструктуру без глобального изменения кода. В качестве минимальной упоминается использование спецификации C++14, которая включает необходимые средства метапрограммирования, а в качестве желаемой - использование спецификации C++20, в которой появилась поддержка концепций, способных исключить появление многих ошибок.

Анвин считает, что C++ более предпочтителен, чем Rust, так как последний существенно отличается от языка С по синтаксису, непривычен для текущих разработчиков ядра и не позволяет постепенно переписывать код (в случае языка С++ можно по частям переводить код с языка C, так как С-код можно компилировать как C++). В поддержку использования С++ в ядре также выступили Иржи Слаби (Jiri Slaby) из компании SUSE и Дэвид Хауэллс (David Howells) из Red Hat.

📎 Читать подробнее

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Почему считается что неправильно писать while (!input_stream.eof())?

▶️В разных источниках говорят что использование std::istream::eof() - это признак плохого кода и что в частности неправильно писать:
while (!input_stream.eof()) {
input_stream >> value;
process(value);
}

Что в этом коде не так? Как писать правильно?


▶️Проблема std::istream::eof() в том, что он выставляется только после выполнения какой-либо операции чтения. Поэтому происходит следующее:
std::ifstream input_stream("empty_file.txt"); // Открываем пустой файл
if (!input_stream.eof()) { // eof() == false, т.к. мы еще ничего не читали
int value;
input_stream >> value; // Пытаемся читать число, а его там нет.
// Здесь eof() == true, но мы это не проверяем.
std::cout << value; // Выведется 0.
}

Так что если и вызывать eof(), то это надо делать после операции чтения.

Однако, объекты std::istream умеют преобразовываться в bool, а каждая операция чтения возвращает ссылку на std::istream. Поэтому идиоматичный код выглядит следующим образом:
while (input_stream >> value) {
process(value);
}


Или для строки:
std::string str;
while (std::getline(input_stream, str)) { ... }


Или сразу для нескольких значений:
while (input_stream >> value1 >> value2) { ... }

Здесь если при чтении value1 произойдет ошибка, то все последующие операции чтения (т.е. value2) будут игнорироваться, по этому можно читать сразу несколько значений сразу, и уже потом проверять состояние std::istream.

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Некоторые тонкости генерации случайных чисел в C++

C и C++ имеют свои собственные встроенные генераторы случайных чисел. Они реализованы в двух отдельных функциях, которые находятся в заголовочном файле cstdlib:

srand() устанавливает передаваемое пользователем значение в качестве стартового. srand() следует вызывать только один раз — в начале программы (обычно в верхней части функции main())

rand() генерирует следующее случайное число в последовательности. Оно будет находиться в диапазоне от 0 до RAND_MAX (константа в cstdlib, значением которой является 32767).

Вот пример программы, в которой используются обе эти функции:
#include <iostream>
#include <cstdlib> // для функций rand() и srand()

int main()
{
srand(4541); // устанавливаем стартовое значение - 4 541

// Выводим 100 случайных чисел
for (int count=0; count < 100; ++count)
{
std::cout << rand() << "\t";

// Если вывели 5 чисел, то вставляем символ новой строки
if ((count+1) % 5 == 0)
std::cout << "\n";
}
}

// 14867 24680 8872 25432 21865
// ...



Рандомные числа в C++ 11

В C++ 11 добавили тонну нового функционала для генерации случайных чисел, включая алгоритм Вихрь Мерсенна, а также разные виды генераторов случайных чисел (например, равномерные, генератор Poisson и пр.). Доступ к ним осуществляется через подключение заголовочного файла random.

Вот пример генерации случайных чисел в C++11 с использованием Вихря Мерсенна на картинке.

Вихрь Мерсенна генерирует случайные 32-битные целые числа unsigned (а не 15-битные целые числа, как в случае с rand()), что позволяет использовать гораздо больший диапазон значений.
Существует также версия (std::mt19937_64) для генерации 64-битных целых чисел unsigned

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 AdaptiveCpp: универсальный SYCL-компилятор с рекордной производительностью

На днях вышла новая версия компилятора AdaptiveCpp 24.02, ранее известного под названиями hypSYCL и Open SYCL. Этот компилятор на основе C++ предназначен для создания программного кода, работающего на различных процессорах и графических процессорах ведущих производителей. Возможности такого программирования обеспечиваются стандартами SYCL и параллелизмом C++.

Версия AdaptiveCpp 24.02 принесла ряд улучшений в работу компилятора. Разработчики отмечают, что благодаря этим улучшениям их продукт стал одним из лучших (а во многих случаях и самым лучшим) компилятором SYCL в мире с точки зрения эффективности использования аппаратных ресурсов.

Тесты показали, что AdaptiveCpp 24.02 работает значительно быстрее предыдущей версии 23.10 и, как правило, превосходит по производительности стек SYCL от Intel, одного из крупнейших производителей в этой области.

Одной из ключевых особенностей новой версии является отказ от необходимости указывать конкретные цели компиляции для создания исполняемого файла. Теперь простая команда компиляции acpp -o test -O3 test.cpp позволяет создать бинарный файл, который будет работать на GPU от Intel, NVIDIA и AMD, что делает AdaptiveCpp единственным в мире компилятором SYCL, способным генерировать такие универсальные исполняемые файлы.

Кроме того, в новой версии появился новый JIT-компилятор для CPU, который обеспечивает более высокую производительность по сравнению со старым компилятором на основе OpenMP.
AdaptiveCpp 24.02 также предлагает кэширование ядер на диске, автоматическую специализацию ядер во время выполнения и другие улучшения.

🖥 Дополнительные сведения о выпуске AdaptiveCpp 24.02 и ссылки для скачивания доступны на GitHub

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Как выстрелить себе в ногу в C++

Полезная статья о том, что с C++ нужно быть поаккуратнее.
В статье освещается множество важных нюансов, в частности:
Неинициализированные переменные
Подозрительный #define
Ошибки с функцией free
Ошибки с оператором delete
Функции без возвращаемого значения
Работа с исключениями
Сравнения с беззнаковыми переменными
Опасные указатели

📎 Статья

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Жизненная проблема в C++: правильное использование проверки конца файла

При использовании в C++ кода
while(!file.eof())
{
// Чтение из файла
}

получаются неприятности - лишняя считанная строка, например. Почему? Как правильно проверить, что достигнут конец файла?

В чём дело?
Признак достижения конца файла выставляется только после неудачной попытки чтения за его концом. Поэтому, если в теле цикла нет проверки, успешно ли выполнено чтение из файла - последнее чтение окажется именно тем неудачным чтением, которое выставит признак достигнутого конца файла (а для вас это будет выглядеть как, например, еще раз считанная последняя строка, если она находилась в буфере для чтения).

Лучше для этого использовать цикл for и в заголовке выполнять само чтение с проверкой:
for(int n; file >> n; ) 
{
// Обработка считанного значения n
}

if (file.bad())
std::cout << "Ошибка ввода-вывода при чтении\n";
else if (file.eof())
std::cout << "Достигнут конец файла\n";
else if (file.fail())
std::cout << "Неверный формат данных\n";


@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
🖥 Autocheck — проект на базе LLVM/Clang для проверки кода C/C++ на соответствие стандарту AUTOSAR

Не так давно года Syrmia (занимается разработкой встроенного ПО) представила Autocheck.
Это открытый проект парсера на базе LLVM/Clang для проверки кода C и C++ на предмет оценки его пригодности для работы внутри транспортных механизмов (автомобилей и прочего) и других критически важных для безопасности технических сред в рамках соответствия требованиям стандарта AUTOSAR (AUTOmotive Open System ARchitecture) C++14.

Также Autocheck доступен в качестве плагина для VSCode. В этом случае Autocheck отображает нарушения правил AUTOSAR C++ в режиме реального времени по мере того, как пользователь вводит код. Каждое нарушение выделяется в редакторе, а сообщение о нарушенном правиле отображается при наведении курсора на код, а также на панели Problems.

🖥 Исходные коды проекта Autocheck выложены на GitHub под лицензией Apache License 2.0

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Интеграция HTML/CSS UI в разработку C++ приложений

▶️Итак, если вам требуется быстро интегрировать веб-интерфейс в приложение, написанное на C++, используйте Chromium Embedded Framework (CEF). Подключив экземпляр CEF к вашему проекту, загрузите HTML-документ и запустите цикл обработки событий CEF. Эта гибридная схема разработки позволит вам реализовать интерфейс на HTML/CSS, оставив при этом бекенд на C++. Выглядеть это может как-то так:
#include "include/cef_app.h"

int main(int argc, char* argv[]) {
CefMainArgs main_args(argc, argv);
CefSettings settings;

// выполняем инициализацию
CefInitialize(main_args, settings, nullptr, nullptr);

// создаем окно с UI
CefWindowInfo window_info;
CefBrowserHost::CreateBrowser(window_info, new SimpleHandler(), "file:///your_ui.html", CefBrowserSettings(), nullptr);

// цикл обработки сообщений
CefRunMessageLoop();

// Cef для окончания работы
CefShutdown();
}

Замените "file:///your_ui.html" на путь к вашему HTML-файлу. Вуаля! Ваш интерфейс на HTML/CSS уже встроен в приложение на C++.


▶️CEF зарекомендовал себя как надёжное решение для интеграции Chromium в приложения на C++, однако есть и другие варианты, которые стоит рассмотреть:

Electron: Объединяет Chromium и Node.js, позволяя использовать JavaScript для построения настольных приложений.

Ultralight: Идеально подходит для приложений на OpenGL или DirectX, где важна эффективность рендеринга HTML.

Qt WebEngine: Дает доступ к возможностям Qt с поддержкой интеграции веб-контента.

Sciter: Имеет компактный движок для работы с HTML/CSS, поддерживающий такие возможности, как SVG и WebSocket.

Awesomium, движки на базе WebKit или Gecko: Предлагают функциональность, схожую с CEF, однако с некими уникальными отличиями.


▶️При выборе фреймворка обратите внимание на его уровень зрелости, поддержку со стороны сообщества и доступность документации.

📎 Читать подробнее

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Ежегодная программа Google Summer of Code 2024

Organic Maps призывает всех желающих принять участие в ежегодной программе Google Summer of Code 2024 (GSoC), в рамках которой контрибьюторы со всего мира участвуют в разработке программного обеспечения с открытым исходным кодом под руководством опытных наставников из различных организаций.

Участвуйте в GSoC, пробуйте свои силы)

🖥 Organic Maps, Github 8K⭐️
(большая часть проекта на C++, 76.1%)

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Неплохой вебинар про атомарные типы данных и Memory Ordering в C++

Обсуждаются типы данных в C++, для которых не нужна дополнительная синхронизация при конкуретном доступе.
Параллельно спикер рассказывает, как С++ помогает тонко оптимизировать lock-free разработку с помощью memory ordering.
Рекомендую, затрагивается много полезных для понимания вещей

📎 Кликабельный план вебинара
📎 YouTube

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 C++ Insights – Посмотрите на свой исходный код глазами компилятора

Цель C++ Insights - сделать видимыми вещи, которые обычно происходят за кулисами. Речь идет о волшебстве, которое компилятор совершает для нас, чтобы заставить все работать.

Github

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Релиз среды разработки Qt Creator 13

3 апреля 2024 года состоялся релиз открытой среды разработки Qt Creator 13. Это событие произошло после недавнего выпуска фреймворка Qt 6.7 и спустя пять месяцев после выхода Qt Creator 12.

Qt Creator (ранее известная под кодовым названием Greenhouse) — свободная IDE для разработки на С, C++, JavaScript и QML. Разработана Trolltech (Digia) для работы с фреймворком Qt. Включает в себя графический интерфейс отладчика и визуальные средства разработки интерфейса как с использованием QtWidgets, так и QML. Поддерживаемые компиляторы: GCC, Clang, MinGW, MSVC, Linux ICC, GCCE, RVCT, WINSCW.

В состав Qt Creator входит передовой инструмент Qt Designer, позволяющий создавать внешний вид окна приложения, добавляя и перетаскивая элементы по аналогии Windows Forms в Visual Studio. В качестве систем сборки используются qmake, cmake и autotools.

📎 Подробнее

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Отличный онлайн-учебник по C++

Держите годный онлайн-учебник по C++, здесь обсуждаются самые нужные темы, много кода с детальным объяснением, много практических заданий

Вот некоторые из обсуждаемых тем:
• Множественное и виртуальное наследование
• Идентификация типов во время выполнения
• Определение шаблона функции
• Абстрактные контейнерные типы
• Перегрузка операторов
• Область видимости и время жизни
• Инициализация, присваивание и уничтожение класса

📎 Учебник

@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM