Как стать автором
Поиск
Написать публикацию
Обновить
116.32

C++ *

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

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

Корутины C++ для чайников: пишем асинхронный веб-клиент

Уровень сложностиСредний
Время на прочтение24 мин
Количество просмотров37K

Написать этот материал меня побудило... отсутствие хороших статей по корутинам в C++ в русскоязычном интернете, как бы странно это не звучало. Ну серьезно, C++20 существует уже несколько лет как, но до сих пор почти все статьи про корутины, что встречаются в рунете, относятся к одному из двух типов. Или обзор начинается с самых глубин и мелочей, пересказывая cppreference, а потом автор выдыхается и все сводится к "ну а дальше все понятно, возьмите и примените это в своем коде", что напоминает известную картинку с совой. Либо иногда в статьях рассматривается применение корутин на примере генераторов, и этим все и ограничивается. Но, давайте будем честны, генераторы — это замечательно, но за все время моей многолетней карьеры разработчика я, вероятно, делал что‑то подобное генераторам разве что разок, в то время как асинхронный ввод‑вывод приходится использовать почти в каждом проекте. И поэтому меня гораздо больше интересует реализация асинхронного ввода‑вывода с использованием корутин, а не генераторы. Поэтому пришлось разбираться во всем самому.

Читать далее

Смотрим как работает RVO C++ в gcc

Уровень сложностиСредний
Время на прочтение4 мин
Количество просмотров4.8K

В данной небольшой статье я предлагаю рассмотреть как работает принцип RVO (return value optimization) в компиляторе gcc. Автор статьи не претендует на уникальность и какую-то новизну. Ориентировано на начинающих и представляет собой больше некую заметку.

Итак, рассмотрим класс и код, его использующий:

Читать далее

Это слишком опасно для C++

Время на прочтение6 мин
Количество просмотров35K

Некоторые паттерны стало возможно использовать на практике только благодаря безопасности Rust по памяти, а на C++ они слишком опасны. В статье приведён один такой пример.

Работая над внутренней библиотекой, написанной на Rust, я создал тип ошибок для парсера, у которых должна быть возможность сделать Clone без дублирования внутренних данных. В Rust для этого требуется указатель с подсчётом ссылок (reference-counted pointer) наподобие Rc.

Поэтому я написал свой тип ошибок, использовал его как вариант ошибок fallible-функций, и продолжил двигаться дальше.

Читать далее

Фаззинг библиотек

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров3.6K

Ещё недавно, как я начал изучать веб хакинг, я счёл интересным занятие исследовать Linux и Windows на предмет бинарных уязвимостей. Хотя легально заработать в одиночку хакером у нас в России я думаю можно только веб хакингом, я всё равно хочу изучать все интересующие аспекты атакующей и защищающей стороны. Кто знает, вдруг я когда-нибудь буду в red team. Ну а пока я просто грызу гранит науки.

Слегка поразмыслив над решением задачи, я определил что нужно для осуществления моей проблемы. Я не знаю как другие проводят фаззинг библиотек, у которых нет исходных текстов, но додумался до одного варианта. Далее будут два примера для Linux и Windows.

Читать далее

Итак, вы унаследовали старую кодовую базу на C++. Что дальше?

Уровень сложностиСредний
Время на прочтение21 мин
Количество просмотров16K

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

Теперь вы отвечаете за кодовую базу на C++. Она большая, сложная и своеобразная; достаточно слишком долго на неё посмотреть, как она начинает разваливаться разными интересными способами. Иными словами, это легаси.

Но баги всё равно как-то нужно устранять, а ещё добавлять новые фичи. То есть вам нельзя просто закрыть на неё глаза или что ещё лучше, взорвать её динамитом. Она важна для компании. По крайней мере, для тех, кто платит вам зарплату. А значит, важна для вас.

И что делать теперь?

Не волнуйтесь, у меня такое случалось очень много раз и в разных компаниях (кто-то язвительный может спросить: а разве кодовые базы на C++ бывают какими-то другими?), выход есть, он не особо сложен и поможет вам действительно устранять баги, добавлять фичи, а то и когда-нибудь переписать её.

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

Проверяем Blender

Уровень сложностиСредний
Время на прочтение16 мин
Количество просмотров8.9K

Командный центр PVS-Studio: "Как быстро летит время... А ведь в этом году, второго января, Blender исполнилось 30 лет! Как будто ещё вчера мы публиковали статью с разбором ошибок... Как 8 лет назад? Надо срочно исправлять ситуацию!".

Читать далее

Файловый ввод, сделанный по-человечески

Время на прочтение21 мин
Количество просмотров25K

Поводом к написанию данной статьи и к разработке соответствующей мини-библиотеки ffh стало одно из практических заданий по дисциплине ‘Языки программирования’, которую я веду. В этом задании необходимо прочитать все строки из текстового файла для последующей обработки. Так вот, у студентов, выбравших для выполнения этого задания язык C++ [язык программирования выбирается студентом для каждого задания, но чаще всего выбирают C++ или Python], почему-то иногда читалась из файла лишняя пустая строка. В прошлые годы я не придавал этому большого значения, но в последний раз решил таки разобраться в чём проблема.
Читать дальше →

Кодируем крестики-нолики в 15 битах

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров10K

Недавно я наткнулся на пост Алехандры Гонсалес (@blyxyas), в котором рассказывается о попытке сжать игру крестики-нолики в минимальное количество битов. Она пришла к решению из 18 битов. Это заставило меня задуматься: а можно ли улучшить этот результат?

Как говорит Алехандра, существует 765 возможных состояний игры1. Мы можем просто назначить число каждому состоянию, что займёт 10 битов2. Но, по словам Алехандры, это «скучно». С таким описанием игры мы практически ничего не сможем сделать. Когда будет нужно считать значение из конкретной ячейки или перейти из одного состояния в другое, на практике нам придётся использовать таблицу поиска, сопоставляющую каждое число с более крупным и структурированным описанием, что делает бессмысленным саму идею сжатого описания.

Читать далее

Митап по С++ в Питере и онлайн: цена абстракции, статический анализ и дискуссия о код-ревью

Уровень сложностиПростой
Время на прочтение2 мин
Количество просмотров1.5K

20 марта собираемся на бесплатном митапе в Санкт-Петербурге и онлайн. Константин Владимиров расскажет о цене абстракции, а разработчик из команды телекома YADRO Владимир Леонтьев на примере инструмента генерации RPC-серверов покажет, как написать кодогенератор. В конце встречи создатель Sprinx Андрей Аксенов, разработчик VK AdTech Станислав Юрченко, техлид Kaspersky Александр Еналдиев и разработчик YADRO Илья Казаков вместе с гостями и зрителями митапа обсудят тонкости код-ревью.

В этом материале делимся программой митапа. Регистрация уже открыта — переходите по ссылке и заполняйте форму, чтобы присоединиться к мероприятию.

Читать далее

Максимально простая игра на C++ (в консоли)

Уровень сложностиСредний
Время на прочтение12 мин
Количество просмотров25K

Мой выбор остановился на простецкой игре - виселице, запускаемой в консоли, которую я решил написать на С++. Здесь я хочу рассказать о том, как я её реализовал, что использовал и т.д.

Читать далее

Константность в C++

Уровень сложностиСредний
Время на прочтение31 мин
Количество просмотров23K


Продолжаем серию «C++, копаем вглубь». Цель этой серии — рассказать максимально подробно о разных особенностях языка, возможно довольно специальных. Это седьмая статья из серии, список предыдущих статей приведен в конце в разделе 10. Серия ориентирована на программистов, имеющих определенный опыт работы на C++. Данная статья посвящена концепции константности в C++.


Переменные являются основой любого языка программирования. Если значение переменной нельзя изменить после инициализации, то такие переменные называются неизменяемыми (immutable) переменными или константными переменными или просто константами. Константные переменные в том или ином виде поддерживаются во всех языках программирования и играют в них важную роль. Такие переменные помогают компилятору оптимизировать код, улучшают читаемость и надежность кода, позволяют выявлять бОльшее количество ошибок на стадии компиляции. Константы помогают решать проблемы, связанные с многопоточным доступом к переменным. Использование константных переменных влияет на проектные решения в объектно-ориентированном программировании, а функциональное программирование изначально исходит из неизменяемости используемых переменных.


В C++ концепции константности уделяется значительное место. Для переменных используется два вида константности, имеются ссылки и указатели на константу, константные функции-члены, константные итераторы. Попробуем разобраться во всех этих понятиях.

Читать дальше →

Каков C++ в gamedev'e?

Уровень сложностиПростой
Время на прочтение11 мин
Количество просмотров31K

Хотел написать продолжение к статье Что почитать игровому программисту? про использование С++ в игровых движках, но размышления свернули куда-то не туда.

Завороженно смотрю как и какими темпами идет развитие языка в последние годы, и понимаю, что получить и особенно применить возможности С++20/3 в разработке игр и движков получится хорошо, если с опозданием лет эдак в пять, как раз на следующее поколение консолей, если вообще получится. Сейчас плюсы в игрострое зависли где-то между 14 и 17 стандартом, Сони только-только выкатила свою версию компилятора с полной поддержкой 17 стандарта, а учитывая реактивность игровых студий в изменении кор пайплайнов, что-то новое начнут только в новых проектах. Менять коня, т.е. компилятор посреди разработки игры равносильно стрельбе не только по ногам себе, но и соседям программистам: работает - не чини.

Если смена компилятора и стандарта не даст гарантированного прироста скорости работы больше 5%, то бюджет и людей я не одобрю. (с)

Знакомство с кодовой базой больших движков дает понимание уровня и объёмов кода в продакшене и в тулзах, и ситуация вырисовывается такая, что эти объемы стали в индустрии, что называется "too big to fall", т.е. написать что-то новое, уровня движков вроде Unity/Unreal/Dagor на другом языке, будь он хоть в тысячу раз безопаснее и в десять раз быстрее не получится, но попытки конечно делаются. И чем дальше продолжается поддержка существующих проектов на плюсах, тем меньше возможности выбора остается.

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

По техдолгам будут платить наши джуны

Эмуляция сотового телефона… на сотовом телефоне

Уровень сложностиСредний
Время на прочтение12 мин
Количество просмотров15K


О чём только не пишут на Хабре. Например, о создании J2ME-игры в 2024 году, о написании программ на ассемблере под Nokia 3310. Вдохновлённый этими статьями, я тоже решил создать нечто подобное. Это «нечто» должно удовлетворять следующим критериям:

а) Быть не слишком простым в техническом плане;
б) Быть, вероятно, бесполезным в практической эксплуатации;
в) Иметь ностальгические элементы.

Многие помнят линейку телефонов Siemens 65-75 серии, которые были в ходу около 20 лет назад. Мы попробуем провести необычный эксперимент на их основе, для чего напишем небольшую управляющую библиотеку на C, а также изменим код одной из встроенных в ОС Linux утилит. Подробнее в статье.
Читать дальше →

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

Краткий обзор развития лямбда-выражений в C++11, C++14, C++17 и C++20

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров19K

Привет, Хабр!

Сегодня рассмотрим лямбда-выражения в C++ и их эволюцию с момента появления в стандарте C++11 и до последних обновлений в C++20.

Лямбда-выражения в C++ — это анонимные функции, которые позволяют писать инлайн-выражения прямо там, где они используются. С их помощью можно легко определять функции обратного вызова, передавать их в функции высшего порядка или использовать для инициализации функциональных объектов.

Читать далее

Хакаем спортивные часы

Время на прочтение4 мин
Количество просмотров5.7K

Введение



Взглянув на эти часы, можно подумать, что это обычные часы для бегунов.

Ну а я считаю, что это одни из самых лучших потребительских цифровых часов со сверхнизким энергопотреблением в мире!

Позвольте мне объясниться…

Спецификации


Это Timex m851. В них установлены 8-битный CPU Seiko SC188, 48 КБ ROM, 2 КБ RAM и матричный дисплей 42x11.

CPU спроектирован с расчётом на работу со сверхнизким энергопотреблением — одной батарейки хватает на три года!

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


А что это за контакты сбоку? Это USB. Естественно, можно синхронизировать информацию наподобие встреч и тому подобного (для этого есть удобная Linux-библиотека).

И вот что интересно — у часов есть SDK, и он на удивление хорош!

Достаточно ввести $ cc helloworld.c и загрузить код в часы.

Изначально я не думал, что влюблюсь в эти часы — мастер разработки, который Timex предоставлял в эпоху Windows XP, был ужасен. Однако оказалось, что он просто управляет находящимся внутри тулчейном в стиле UNIX.

А если его вытащить, то хакинг становится довольно увлекательным занятием!
Читать дальше →

Соединяем Flutter, Firebase и ESP32 в единую систему

Уровень сложностиСложный
Время на прочтение15 мин
Количество просмотров8.8K

Всем привет! Это Мурат Насиров, Flutter-разработчик в Friflex. Мы разрабатываем высоконагруженные мобильные приложения для бизнеса и специализируемся на Flutter. 

Сегодня расскажу, как использовать микроконтроллер ESP32 в связке с Flutter-приложением. В качестве примера покажу, как снимать показания температуры и влажности с помощью датчика DHT11 и передавать эти данные через Firebase Realtime Database в приложение.

Читать далее

Новый рекорд производительности FizzBuzz

Уровень сложностиСредний
Время на прочтение18 мин
Количество просмотров6.2K

283 ГБ/с на AMD Ryzen 9 7700X.

Сборка (протестирована с GCC 13):

g++ fizzbuzz.cc -march=native -o fizzbuzz -O3 -Wall -std=c++20 -fno-tree-vectorize -fno-exceptions

На сборку уходит несколько минут. В зависимости от CPU можно добиться повышенной производительности с -fno-tree-vectorize или без этого ключа.

Читать далее

Почему проверять результат вызова malloc c помощью assert плохая идея

Уровень сложностиСредний
Время на прочтение3 мин
Количество просмотров9K

malloc и assert


Указатель, который вернула функция malloc, необходимо проверить перед использованием. Неправильным решением будет использовать для этого макрос assert. В этой статье мы разберём, почему это является антипаттерном.

Читать дальше →

Установка GCC в сборке MinGW

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров44K

Установка коллекции компиляторов GCC (GNU Compilers Collection) в Windows и первичная настройка для дальнейшей работы.

Читать далее

Вороной, Манхэттен, рандом

Уровень сложностиПростой
Время на прочтение34 мин
Количество просмотров21K

Это история про то, как не довести дело до конца, но получить уйму опыта, и вообще ни разу не обломаться.

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

Осторожно, очень много картинок!

Читать далее

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