Как стать автором
Обновить
213.34

C++ *

Типизированный язык программирования

Сначала показывать
Порог рейтинга

«Плюсовое» чтиво: ежемесячная рассылка о разработке на С++

Инженеры YADRO пишут не только статьи, но и письма о «плюсах». Подписчики рассылки раз в месяц получают короткую заметку о том, что важно или интересно разработчикам на С++. Какие письма уже выходили:

— Подборка лучших выступлений с Zero Cost Conf с комментариями Константина Владимирова.
— Презентация новой книги Кирилла Колодяжного о машинном обучении на С++.
— Совет, как избежать проблемы с лямбда-корутинами от ведущего инженера Елены Степановой.

Обычно контент из рассылки не найти на других платформах, поэтому оставайтесь на связи, чтобы не пропустить уникальные материалы.

Подписаться на рассылку →

Теги:
+3
Комментарии2

Один из пользователей сервиса Highload.fun Joad Nacer прогнал все задачи через GPT O1 и получил интересный результат:

Картинка из ТГ Highload.fun
Картинка из ТГ Highload.fun

По 2024 году результат расположился на 20 месте с 3,574 очками, как я понимаю код был на C++. В целом нормально, но я, непрофессиональный кодер на C#, разместился на 23 месте, так что я бы оценил кодерство ИИ на уровне студента 1-го курса непрофильной специальности.

Теги:
Всего голосов 2: ↑1 и ↓10
Комментарии3

В Фреймворк DBGridChart добавлено OLAP-приложение "Экспресс_обработка_таблицы.exe ", позволяющее при разработке программ на C++, Java, Visual Basic, F# и на других языках программирования (имеющих средства выполнения из программы готовых приложений из командной строки с параметрами) автоматическое формирование табличных и ленточных форм, форм с диаграммами и графиками с готовым унифицированным многофункциональным интерфейсом пользователя для корректировки баз данных, OLAP-анализу и прогнозированию данных в табличной и в графической формах.

Таким образом, программист при разработке приложения, даже на языке, отличным от C#, может использовать все средства и возможности Фреймворка DFGridChart путем обращения к приложению "Экспресс_обработка_таблицы.exe " с указанием через параметры значения свойствам, например: текст строки подключения к базе данных, текст команды Select, текст строки подстановки. Порядок формирование таких таблиц определяется интерфейсом (меню, кнопки), разрабатываемого программистом для приложения.

Гиперссылка для скачивания Фреймворка "DBGridChart", OLAP-приложения "Экспресс_обработка.exe" и "Экспресс_обработка_таблицы.exe " с исходными текстами, DLL-библиотеками, документацией и с демонстрационными примерами: https://disk.yandex.ru/d/sI1VhBiSPzDp-A

Пример обращения к приложению "Экспресс_обработка_таблицы.exe " при разработке программы на C++

#include <string>

...

// Символ # должен быть указан перед наименованием свойства!// Внутри строковых констант перед символами \ и " нужно указывать символ \
std::string
program = "C:\\Экспресс_обработка_таблицы\\bin\\Debug\\Экспресс_обработка_таблицы .exe", // Местоположение приложения
p1 = "#ConnString=Provider = Microsoft.Jet.OLEDB.4.0;Data Source="C:\\Демонстрационный пример Экспресс обработка таблицы для C++\\Выпуск изделий.mdb", // Строка подключения к базе данных
p2 = "#DBMS = Access", // Тип СУБД, если не указан (p2 не указано), то определяется по строке подключения
p3 = "#Select = SELECT Подразделения.[Код подразделения]@#,Подразделения.[Наименование подразделения]*, Подразделения.[Численность на 2022], Подразделения.[Численность на 2023], Подразделения.[Численность], Подразделения.[Дата формирования], Подразделения.[Код типа подразделения]*, [Типы подразделений].[Наименование типа подразделения], Подразделения.[Действующее] FROM [Типы подразделений] RIGHT JOIN Подразделения~ ON [Типы подразделений].[Код типа подразделения] = Подразделения.[Код типа подразделения] ORDER BY Подразделения.[Наименование подразделения]", // Запрос с возможностью корректировки таблицы Подразделения. Специальные символы при режиме корректировки после имен полей или псевдонимов: ключевое (@), обязательное (*), не корректируемое (#) поле и после имени корректируемой таблицы указывается символ ~, если таблиц несколько во фразе From.
p4 = "#Podstavit_v_kolonki = ктп #-; SELECT [Наименование типа подразделения], [Код типа подразделения] FROM [Типы подразделений] ORDER BY [Наименование типа подразделения]", //Подстановка кода типа подразделения в колонку с именем ктп по наименованию путем выбора мышкой из списка (сформированного указанной командой Select) наименований типов подразделений. Режимы подстановки: только из списка (-), список открывается в текущей ячейке (#).
p5 = "#Flag_Create_SQL_Select = True", // Разрешить (True)/не разрешить (False) использовать конструктор команд SQL (по умолчанию - True и p5 можно не указывать)
p6 = "#Table_№ = 2367", // Уникальный номер (обычно, случайное число) таблицы или запроса для сохранения макета настройки индивидуально для таблицы
parameters = p1 + p2 + p3 + p4 + p5 + p6, // параметры приложения
command = program + " " + parameters; // командная строка
system(command.c_str()); // выполнение приложения, которое формирует табличную форму с многофункциональным унифицированным интерфейсом Фреймворка DBGridChart

Теги:
Всего голосов 16: ↑1 и ↓15-14
Комментарии0

Приветствую, Земляне! Почти 3 месяца миновало с первого релиза NotOnlyClock, моего персонального проекта на платформе Arduino.

NotOnlyClock
NotOnlyClock + Помидор

За это время вышло 2 обновления, подписчики моего Телеграм-канала всегда узнают обо всем самыми первыми. Обновления получила не только прошивка устройства, но и "железная" часть получила опциональную модификацию: теперь, на устройство можно установить кнопки с подсветкой.

Ниже приведен список ключевых изменений 2-х последних обновлений:

  • теперь, можно использовать до 8-ми секундомеров и таймеров одновременно (на 7 больше, чем было доступно ранее);

  • добавлен режим для подсчета количества нажатий с 9-ю независимыми счетчиками;

  • добавлен Помодоро трекер для отслеживания времени работы и отдыха по методу Помидора.

Подробные описания: обновление 1, обновление 2.

Теги:
Всего голосов 2: ↑2 и ↓0+4
Комментарии0

Пишем приложение для поиска объектов на С++ (а не на Python)

Результат работы приложения по поиску объектов на С++
Результат работы приложения по поиску объектов на С++

Приложения по поиску объектов, написанные на С++, работают ничуть не хуже привычных вариантов на Python. На это есть несколько причин:

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

  • C++ не использует дополнительный сборщик мусора для управления памятью — это существенно влияет на производительность программы. 

  • Размер программы также можно уменьшить, поскольку C++ не использует дополнительную виртуальную машину и компилируется непосредственно в машинный код.

Это хороший выбор для мобильных устройств с ограниченным объемом ресурсов, например, телефонов или маломощных плат, которые используются в робототехнике или видеоаналитике.

Если хотите написать такое приложение, изучите материалы инженера YADRO и ML-энтузиаста Кирилла Колодяжного. Он подробно описал, как реализовать программу на С++ с применением библиотек компьютерного зрения.

Подготовительная часть →

Практическая часть →

Теги:
Всего голосов 6: ↑6 и ↓0+8
Комментарии0

GPU для сверточных нейросетей и быстрой обработки данных

В среду, 11 декабря, подключайтесь к бесплатному онлайн-митапу от сообщества C++ Russia. В программе всего два доклада — трансляция начнется в 17:00.

«Свертка на GPU и увеличение ее размерности»

Рассказывает: Кирилл Колодяжный (@Mik42), ведущий инженер по разработке ПО, YADRO

Вы познакомитесь с понятием свертки и ее доступными реализациями для NVIDIA GPU. Вместе с докладчиком рассмотрите различные алгоритмы расчета свертки: наивный алгоритм, FFT, GEMM (im2col/col2im), Winograd. Основное внимание уделим тому, как увеличить размерность свертки, так так сейчас наиболее распространена 3D-свертка.

Кирилл покажет простой подход к увеличению размерности с использованием PyTorch и расскажет, почему он не подошел. Также он поделится деталями реализации подхода на основе vol2col, расскажет, как тот позволяет масштабировать размерности и использовать быстрые реализации базовой операции GEMM с использованием cuBLAS и CUTLASS.

«GPU для ускорения фреймворка обработки слабоструктурированных данных Otterbrix: технологии, массивы и производительность»

  Александр Боргардт, техлид DuckStax 

Доклад посвящен ускорению обработки колоночных данных с использованием видеокарт. Александр рассмотрит применение GPU для оптимизации работы с массивами данных, характерных для фреймворка. Особое внимание уделим сравнительному анализу технологий CUDA и OpenCL с точки зрения их эффективности и применимости в данной области. Сравним производительность подходов в нескольких бенчмарках.

Особенно полезен доклад исследователям и специалистам в области высокопроизводительных вычислений, заинтересованных в использовании GPU для обработки больших объемов данных.

Кому подойдет митап: Организаторы ожидают, что участники понимают и могут читать код на С++. Если вы никогда не программировали GPU, на открытии будет введение в технологию.

Митап пройдет онлайн на платформах YouTube и VK Видео:

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Это не IDE, а neIDE - простое графическое приложение для быстрого запуска небольших программ на C++. Может пригодиться когда появилась идея или что-то прочитал и хочется быстро протестировать, но нет времени на запуск тяжеловесных IDE типа Visual Studio или открывать в браузере 1001-ю вкладку чтобы протестировать в godbolt.org. Нужно лишь назначить комбинацию клавиш на запуск или создать ярлык в доке. Можно конечно по-быстрому запустить vim, набрать код и ручками напечатать "g++ main.cpp && ./a.out", но мне надоело так постоянно делать, поэтому написал программу, которая все это делает сама. Ближайший аналог - geany - мощный блокнот, где можно прописать свои команды, но она мне показалась слишком перегруженной функционалом.

В общем, представляю neIDE, где есть только кнопка "Run", поле для ввода кода и поле вывода результатов/ошибок. При запуске загружает код-заготовку. Работает только с тем кодом, что в окне ввода. Нет возможности подгружать внешние файлы. Написана на wxWidgets. Компилирует код под с++17, но можно легко скорректировать под нужный стандарт. Заточена на Linux, но при некотором упорстве можно скомпилировать на Windows. Минимум строк кода, можно форкнуть и быстро доработать под свои хотелки.

neIDE
neIDE

Ссылки на репозиторий github и gitflic.

Теги:
Всего голосов 9: ↑8 и ↓1+9
Комментарии14

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

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Приветствую, Земляне! Намедни закончил новый проект на платформе Arduino.

NotOnlyClock
NotOnlyClock

Проект получил название NotOnlyClock (Ну не только же часы), и из названия можно предположить, что устройство представляет из себя часы, отчасти это так, и у вас моментально возникнет вопрос: "Очередные часы? Таких устройств уже существует сотни, если не тысячи." Конечно, с этим сложно поспорить, но там помимо часов есть много других функций (секундомер, таймер, будильник, термометр, гигрометр и барометр), кроме этого, я обеспечил проект полным набором документации (схемы, разводки печатных плат, модель корпуса, исходный код прошивки и т.д.), а также обеспечил все подробными инструкциями по сборке. И в конце концов, если что-то хочется - надо это сделать. Надеюсь это принесет пользу не только мне.

Кликайте сюда, чтобы самостоятельно во всем убедиться.

Чтобы узнавать обо всех обновлениях в числе первых, подписывайтесь на Telegram-канал

Теги:
Всего голосов 2: ↑2 и ↓0+4
Комментарии3

Захват переменных в С++ без ошибок? Как?

Попробуем рассказать об этом завтра на нашем бесплатном вебинаре «Ля какие! Лямбды в С++».

Встретимся и поговорим про:

→ Захваты переменных, параметры, возвращаемые значения и типы замыканий.
→ Лямбды в C++20 и C++23.
→ Применение в реальных задачах: передача функций в алгоритмы STL, написание компактных колбэков

⚡️ Спикер: Юрий Вашинко, Tech Lead/Lead Developer с опытом более 15 лет в разработке

📌 15 октября, завтра, в 14:00 мск
📌 Занять место на вебинаре — через бота.

Приходите 🙃

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

Prime World от Nival отдали в open source

Официальный сервер был выключен в 2021 году.

Лицензия запрещает коммерческое использование - но велкам улучшать игру, комьюнити уже занимается этим. Как насчет сборки для Линукс?

Похоже это первая open source MOBA.

Репозиторий: https://github.com/Nival-Pub/Prime-World, скоро должны форкнуть.

Комьюнити:

https://vk.com/primeworldclassic

Там, если хотите, найдете чат программистов.

Если вашу любимую игру не продают - возможно, пора написать создателям/издателю чтобы её тоже открыли - хоть запуск на современных системах можно чинить.

https://www.facebook.com/share/p/hdwgSx9KhuwpJNLr/

Теги:
Всего голосов 6: ↑6 и ↓0+10
Комментарии0

Привет! На связи команда Neiry Tech, мы занимаемся разработкой BCI-устройств и алгоритмов для использования с ними. Расскажем про ПО Capsule, считывающее и записывающее мозговую активность, и другие физиологические сигналы пользователя. И Capsule API — он помогает нам строить на основе классифицированных метрик и индексов итоговые приложения).

По сути Capsule — библиотека для десктопных и мобильных платформ с собственным графическим интерфейсом. Для быстродействия написали её на C++. Для Capsule API выбрали C.

Для вывода в API на разных платформах иногда пишем нативный код на Android или iOS, ну и обертку на C, чтобы API мог использовать широкий спектр разработчиков — за родным ноутом и в лаборатории.

Физиологические данные — сложные сигналы с высоким уровнем шума. Для их интерпретации нужно хорошо владеть методами цифровой обработки сигналов, погрузиться в предметную область, и как минимум понимать, чем фильтр Чебышева отличается от фильтра Баттерворта.

Головной боли добавляют особенности различных платформ — с плавающими задержками протокола BLE, или с реализацией вроде бы базовых вещей. Мы как-то обнаружили, что библиотека, занимающаяся быстрым преобразованием Фурье, нагружала новенькие Apple Silicon на 30%.

Сейчас Capsule и API позволяют работать с данными ЭЭГ и ФПГ на высоком для не лабораторного устройства уровне. Смотрим, радуемся и гордимся.

Хотите поработать с этими данными и нашим API? Присоединяйтесь к хакатону BCI Hack Moscow, регистрация до 15 сентября.

Теги:
Всего голосов 4: ↑4 и ↓0+8
Комментарии0

Ближайшие события

Привет, Хабр! Держите задачу от наставника курса «Разработчик на С++» Саввы Лебедева. Предлагайте варианты решения в комментариях.

Дан непустой массив целочисленных элементов, где каждый элемент повторяется дважды, кроме одного. Найдите этот одинокий элемент.

Идеально выполнить за линейную сложность по времени и константную сложность по памяти. Заодно попробуйте решить эту задачу менее оптимальным способом по памяти, например с использованием множества или словаря.

Пример 1:

Ввод: nums = [2,2,1]
Вывод: 1

Пример 2:

Ввод: nums = [4,1,2,1,2]
Вывод: 4

Пример 3:

Ввод: nums = [1]
Вывод: 1 

Ограничения:

  •  1 <= nums.size() <= 3 * 10^4

  •  -3 * 10^4 <= nums[i] <= 3 * 10^4

  • Каждый элемент в массиве повторяется дважды, кроме одного: он будет единожды.

int FindSingleNumber(vector<int>& nums) {
	...
}

Теги:
Всего голосов 7: ↑6 и ↓1+10
Комментарии17

Почему бы не сделать runtime языка С++ проще и легче? почему бы не сделать его перенос в том числе проще? Когда я задался этим вопросом, я решил, что во чтобы то ни стало, я напишу свой RT, для тех, кто пишет под слабые машины, или тех, кто пишет под bare metal среду. результат вы можете посмотреть на гитхабе: вотъ

Когда я работал, я старался максимально всё упростить, при этом сохранив юзабельность. не знаю как для других, но лично мне было важно сохранить исключения, для меня это удобно. но в С++ они жутко дорогие из-за RTTI (RunTime Type Information), и на bare metal реализуется с большим напрягом. выход прост - использовать статусы вместо типов. но чтобы оставить всем знакомый и удобный синтаксис исключений и позволить функциям возвращать что-то вместо статуса, где это везде лепят, я переделал всё на тупо макросах :>

так же я понял, что сложность моей работы и сложность переносимости этой вещицы усложнится, если прям всё с нуля пилить, поэтому просто воспользовался libc, выпилив libc++. Пришлось сделать обёртки над new и delete, но это не так уж и сложно, просто вызывать malloc/free.

Так же я невероятно сильно намучился в попытках сделать всё используя стандартный синтаксис С++. Потратил несколько часов в попытках разобраться как оторвать исключения от использования rtti, возился в флагах, писать cxa, gxx и unwind с нуля, даже лез в ассемблерный код в попытках вырезать надоеду, но по итогу сдался и просто слепил всё из макросов.

Всем добра <3

Теги:
Всего голосов 3: ↑2 и ↓1+3
Комментарии2

Всем привет. Возможно, вы помните меня по статьям об изменениях в C++ и о фреймворке 🐙 userver, поэтому сразу к делу. 27 июля я выступаю на конференции C++ Zero Cost Conf, которая пройдёт в Москве и Ереване. Там я поделюсь новостями со встречи Международного комитета по стандартизации языка в Сент-Луисе и расскажу о наших планах на C++26 и C++29. А ещё отвечу на ваши вопросы. Приходите в гости!

Помимо меня, вас также будут ждать: 

  • Константин Владимиров, руководитель отдела компиляторов и средств разработки Syntacore. Покажет развитие архитектуры сложного LLVM-based-C++-проекта и конкретные задачи, возникающие при его развитии.

  • Андрей Аксёнов, руководитель разработки инфраструктуры поиска Авито/Sphinx. Расскажет историю из продакшена с One Billion Row Challenge, парсингом гигабайтов TSV’шек, десятью странными оптимизациями и боттлнеками вообще везде.

  • Сергей Слотин, разработчик. Поговорит об устройстве памяти и кешей, их странностях и неожиданных последствиях для производительности.

  • Константин Облаков, старший разработчик браузера Яндекс Поиска и Рекламных технологий. Покажет на практике, как GDB позволяет добиться результатов, недоступных другими методами.

Полный список спикеров и темы докладов смотрите на сайте

Если не получится прийти лично, подключайтесь дистанционно.

Теги:
Всего голосов 5: ↑5 и ↓0+9
Комментарии0

Интересный пример, когда определение friend T (где T — шаблонный параметр) имеет смысл:

template <class T>
class Badge {
   friend T;
   Badge() { }
};

Допустим, у нас есть какой-нибудь публичный метод, и предполагается, что круг его пользователей ограничен одним классом, например:

class VFS {
   ...
public:
   void register_device(Device&);
   void unregister_device(Device&);
};

Предполагается, что эти методы будут вызываться внутри конструкторов (и деструкторов) Device и нигде (и никем) больше. Но как закрепить наше ожидание на уровне API?

Распространенное решение — вынести (un)register_device в приватную часть, а Device объявить другом:

class VFS {
private:
   friend class Device;
   void register_device(Device&);
   void unregister_device(Device&);
};

И это действительно запрещает всем кроме Device обращаться к данным методам. Но это так же разрешает Device обращаться ко всем остальным членам VFS!

Выразить же желаемое наиболее четко и ясно нам помогает как раз таки класс Badge, приведенный в самом начале статьи: мы можем оставить методы (un)register_device публичными, но при этом сделать их первым аргументом значение Badge<Device>:

class VFS {
    ...
public:
    void reg_Device(Badge<Device>, Device&);
    void unregister_device(Badge<Device>, Device&);
};

Теперь чужак не может использовать эти методы, потому что он не может сконструировать Badge<Device>, а а сам Device может вызывать их где и как пожелает:

Device::Device()
{
    VFS::instance().register_device({}, *this);
}

Теги:
Всего голосов 4: ↑4 и ↓0+5
Комментарии2

ZED Online, любительская открытая имплементация знаменитой DOS игры Z - тоже заброшена. Играбельна, но есть проблемки (я завел несколько тикетов), есть краши. Если кто хочет форкнуть и улучшить игру и свой C++.

Вот видео https://www.youtube.com/watch?v=F03PtRb9mvs

Статья в Википедии про оригинал https://en.wikipedia.org/wiki/Z_(video_game) - там написано что рейтинги у игры были высокие.

https://sourceforge.net/projects/zedonline/

Спасибо, хорошего дня.

Теги:
Всего голосов 4: ↑4 и ↓0+6
Комментарии4

27 и 28 марта в Лондоне проходила конференция Rust Nation 24. На конференции выступал Ларс Бергстром [Lars Bergstrom], который занимает в Google пост технического директора. Доклад Ларса носил название «Beyond Safety and Speed: How Rust Fuels Team Productivity» (дословно «Кроме безопасности и скорости: как Rust заряжает команду продуктивностью»).

Во время выступления технический директор Google заявил, что команды Rust в Google в два раза продуктивнее команд C++. Этот мощный посыл успел разлететься фотографией с конференции.

TotempaaltJ

Ларс пояснил, что подразумевается под производительностью. Google — компания, где часто переписывают проекты, а иногда две команды работают над похожими задачами. Поэтому подобный анализ в масштабах Google возможен.

Как выяснилось, на переписывание на Rust нужно примерно столько же времени и людей, сколько уходит на написание продукта на Go. При этом памяти приложения на Rust используют куда меньше, в них меньше дефектов. Когда компонент на C++ переписывают на Rust при одинаковом размере команд, в два или более раз сокращаются время и усилия как для написания, так и поддержки кода.

Слегка портит картину то, что Бергстром — это ещё и председатель совета директоров Rust Foundation, поэтому делать такие заявления он непосредственно заинтересован.

На записи видеотрансляции с конференции обсуждение деталей производительности идёт с отметки 7:30:13.

Теги:
Всего голосов 3: ↑3 и ↓0+3
Комментарии2

Проклятие дженериков 💀

Дженерики могут показаться очень простой темой.
Например, вот так в Java выглядят классные и простые методы интерфейса List:

interface List<E> extends Collection<E> {
	boolean add(E e);
	E set(int index, E element);
}

Но у обобщений много нюансов: вложенность, вариантность, границы и т.д. Это сильно усложняет их использование.
Вот не менее классный, но совсем непростой flatMap интерфейса Stream🙈:

interface Stream<T> extends BaseStream<T, Stream<T>> {
	<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
}

Также, реализация дженериков - всегда трейдоф. Мы либо получаем большой исполняемый файл, из-за того, что приходится генерировать код для разных типов. Либо получаем дополнительную нагрузку в рантайме, из-за различных проверок.

Из-за таких сложностей, в языке Go (философия которого - простота и минимализм) дженерики появились аж через 12 лет после релиза языка. А первый коммент про то что нужны дженерики появился меньше чем через 24 часа🙃

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

  • С++ вышел в 1979, дженерики - 1986

  • Java - 1996, дженерики - 2004

  • C# - 2001, дженерики - 2005

  • Go - 2009, дженерики - 2021

Теги:
Всего голосов 5: ↑3 и ↓2+1
Комментарии8
1

Вклад авторов

Работа

Программист C++
95 вакансий
QT разработчик
6 вакансий