Обновить
233.14

C++ *

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

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

Числовой тип данных с плавающей точкой float IEEE 754

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

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

Читать далее

Новый сезон «Битовых масок» — подкаста о системном программировании и разработке процессоров

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

В «Битовых масках» — подкасте «Истового инженера» — ведущие знакомят слушателей с инженерами, преподавателями и энтузиастами, которые делают железо и низкоуровневое ПО понятнее, ближе и интереснее.

В обширном списке тем — современные инструменты проектирования, open-source-инициативы, архитектуры процессоров, компиляторы, история вычислительной техники. В этом посте мы расскажем о самых известных гостях «Битовых масок» и поделимся планами по нему.

Читать далее

Книга «Экскурс в неопределённое поведение C++». Секреты укрощения единорога

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

Привет, Хабр. С гордостью, триумфом и трепетом хотим рассказать вам об одной из наших флагманских новинок, вышедшей в пылающем июле — книге «Экскурс в неопределённое поведение C++».

Cегодня книжные полки изобилуют нестареющими пособиями по C++. Этот язык чрезвычайно важен не только в разработке игр, финансового софта и встраиваемого ПО, но и как основной материал для изучения алгоритмов. Именно поэтому мы даже выпустили две книги-билингвы по алгоритмам, в которых код на C++ соседствует с идентичным ему кодом на Python. Это наш многолетний бестселлер «Алгоритмический тренинг. Решения практических задач на Python и C++» Максима Иванова и недавняя новинка «Базовые алгоритмы. Реализации на Python и C++ на примере классических игр» Павла Довгалюка. Но язык C++ не только очень полезен, но и опасен, так как на этапе преобразования исходного кода в машинный многие решения отдаются на откуп компилятору. Поскольку компилятор в большинстве режимов изначально заточен на оптимизацию кода, он регулярно привносит в код C++ непредсказуемые и порой необъяснимые варианты неопределённого поведения (UB, Undefined Behavior). Титаническую работу по систематизации неопределённого поведения в C++ проделал уважаемый Дмитрий Свиридкин @Nekrolm. В настоящее время он работает инженером по программированию встраиваемых систем в отделе Cloudfront Compute компании AWS. Дмитрий преподавал курсы по Linux и C++ в Санкт-Петербургском государственном университете и Высшей школе экономики, а также имеет богатейший послужной список, в котором есть и олимпиады по информатике, и машинное обучение, и программирование прошивок и, конечно же, выжимание последних капель производительности из самого неукротимого облачного железа. Некоторое время его заметки публиковались на сайте компании PVS-Studio, разрабатывающей известный российский статический анализатор кода. Далее под катом - предисловие Андрея Карпова, а также обзор самой книги.

Читать далее

Я оплачиваю квартиру за счет Python-инструмента, который собрал за выходные

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

Я создал этот инструмент, потому что устал от одних и тех же скучных кликов каждую неделю. Мне нужен был инструмент, который: отслеживает папку, извлекает данные из PDF, обогащает их, отправляет отчеты и, в идеале, позволяет выставлять кому-то счет за сэкономленное время. Два выходных, несколько библиотек и пачка кофе – и у меня был продукт, за который люди действительно платили.

Ниже я покажу точный технологический стек, архитектуру, методы монетизации и паттерны кода, которые я использовал. Вас ждет практический код, ООП-структура и один небольшой трюк с C++, когда чистого Python уже не хватало.

1. Выбирайте маленькую, но болезненную задачу

Большинство проектов по автоматизации умирают, потому что пытаются решить слишком много. Вместо этого выберите одну повторяющуюся «боль» с измеримым ROI. Моя проблема была такой:

Читать далее

Работа с сокетами C++

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

Сокет - это абстракция, конечная точка соединения между сервером и клиентом, сокет представляет собой файловый дескриптор, в котором содержатся все параметры для соединения, именно через сокет и передаются многие данные.

Существуют несколько протоколов сокетов, основные из них: TCP и UDP.

Читать далее

C#-like properties в C++ размером 1 байт

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

Иногда в С++ не хватает каких-то фич, которые есть в других языках. Мне, например, не хватает preperties из C#. В них можно описать функции set/get, при этом работать с ними через поле класса, как с переменной.

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

actor.SetTransform(left.GetTransform() * right.GetTransform() * up.GetTransform());

Но хочется более простой и понятный синтаксис:

actor.transform = left.transform * righ.transform * up.transform;

Под катом я расскажу как можно в С++ обернуть set/get в переменную с минимальным размером 1 байт

Читать далее

Подробно о неопределённом поведении в С и C++

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

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

Читать далее

Подножка для AI в виде UTF-8

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

Думаю, вам начинают надоедать тексты про вайб-кодинг. Но не волнуйтесь, мой интерес не в том, чтобы рассказывать о новых невероятных достижениях, меняющих мир, и бла-бла-бла... Интереснее поискать места, в которых начинается сбой при генерации кода. Это позволит адаптировать работу статических анализаторов для новых задач контроля кода, который создаётся с помощью таких систем.

Читать далее

Как статический анализ побуждает разработчика рефакторить код. По мотивам Source SDK

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

Ранее утро. Туман окутал горные хребты. Просыпайся, Гордон, вставай. Нам пора отправляться в сердце тьмы и освободить этот мир от лап дремлющего зла. Да, и не забудь свою монтировку.

Читать далее

Минималистский графический интерфейс, на C++ / WTL, для консольного загрузчика

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

Введение

Всё началось с комментирования статьи: «[Как я написал современный GUI для yt-dlp на Python]( https://habr.com/ru/articles/930260/)».

Программа автора мне понравилась, и я обещал ему попробовать сделать аналогичный проект на C++ / WTL.

Так вот, не прошло и полгода, как первая версия аналогичной программы уже готова. Её рабочее название – MiniDL, а исходники доступны на сайтах:

http://polezp.narod.ru/Prg/MiniDL100.zip

и

http://lecole.free.nf/Prg/MiniDL100.zip

или

https://disk.yandex.ru/d/yGQDXbkpk6LPqw

Архив содержит также скомпилированные бинарники для 32-х и 64-х разрядных, релизных версий, под Windows («MiniDL32r.exe» и «MiniDL64r.exe»).

Естественно, создать конкурентный интерфейс профессиональной библиотеке CustomTkinter, для Питона, на сверхлегком движке WTL, за обозримое время, практически невозможно. Но такая задача и не ставилась. Хотелось просто реализовать идею автора – работать с удобной графической оболочкой для консольной программы, в данном случае – внешнем загрузчике медиа-контента из Ютуба и других, поддерживаемых им сайтов.

Ради простоты, пришлось отказаться от попытки реализовать все интерфейсные плюшки автора и ограничиться минималистским вариантом. Тем более что, лично меня он вполне устраивает. Более того, поскольку я привык работать в Total Commander, то там вполне удобно использовать и консольные программы, особенно в паре с командным файлом их запуска, что позволяет перенести туда все параметры командной строки. А, в случае с загрузчиком yt-dlp.exe ситуация оказалась еще лучше, так как, он поддерживает конфигурационный файл, с мощными настройками. Если их хорошо освоить, то, в принципе, ничего больше и не надо. Ведь, эти настройки позволяют легко скачивать не только аудио и видео файлы, но и субтитры к ним и тому подобное. Также, легко и просто указать каталог загрузки, но уже в нашей программе, и не мучиться, как автор, с сохранением их на рабочий стол.

Читать далее

Как работает система владений и ссылок в Rust на низком уровне

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

Привет Хабр! В этой статье я хотел поговорить о теме вечных конфликтов разработчиков на C++ и Rust. Стоит ли того система управления памятью в Rust или все-же это бестолковый механизм стремящийся составить конкуренцию родному методу?

Систему управления памятью я разберу, а вот выводы остаются уже за вами.

Читать далее

Хороший, плохой, цветной и быстрый

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

Давным-давно, когда с ездовым котом приключилась "записка шестая", а знания об аллокаторах и опыт их применения ограничивался линейным и системным, перебросили мою команду в помощь другой команде, которая занималась системами навигации больших судов. Ездовые коты, особенно нестарые - это такие создания, которые редко изучают документацию детально, а чаще бегло читают там про интерфейсы систем в проекте, malloc, new, системные аллокаторы и думают, что теперь-то точно понятно, как всё устроено. А потом приходит работа и такая: “Забудь всё, что ты знал. Ты не дочитал до страницы восемьсот что-то там РД, тут есть свой аллокатор - и он реально плохой”.

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

А вот почему нужны и важны ненормальные - объяснений почти нет, как и самих реализаций в открытом доступе. В этой статье я расскажу, какие повстречал ненормальные алгоритмы распределения памяти, чем они живут, кого едят, и почему иногда malloc делает вид, что он не при делах и таки да, malloc может возвращать null и ту проверку мы убрали зря.

Читать далее

Как сокращение полных путей файлов в логах влияет на производительность и размер Браузера

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

Всем привет! Меня зовут Илья Кара́псин, я работаю над производительностью Яндекс Браузера. Задачи моей команды включают не только работу над самим браузером, но и прямое улучшение используемых в нём опенсорс‑решений, например Chromium и применяемых в нём проектов (Blink, V8, Catapult), в том числе и компиляторов (LLVM Clang). Другими словами, мы вносим вклад в сообщество. При этом поиск и создание улучшений для сторонних опенсорс‑проектов может стать прямой рабочей задачей даже в ходе стажировки.

К слову, моя работа в Браузере как раз с неё и началась. При отборе положительно сказалось наличие у меня pet‑проектов: отдельного внимания заслужил проект, использующий озвучку и SFX (сноска: сокращение от англ. sound effects — звуковые эффекты) из Heroes of Might and Magic V. Так удивительно совпало, что мой будущий руководитель ранее работал в Nival Interactive как раз над этой игрой.

А в этой статье я расскажу о том, как обычное сокращение полных файловых путей в логах до имени файла (например, path/to/filename → filename) может повлиять на размер исполняемых файлов и производительность Браузера, а также внести вклад в проект LLVM Clang.

Читать далее

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

Слёзы, баги и C++: как Isaac стал легендарной игрой

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

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

Помню, как впервые запустил The Binding of Isaac: стартовая комната без подсказок, закрытые двери, на миникарте пусто. Пара забегов и у меня уже список технических вопросов по генерации этажей, приоритетам предметов, поведению врагов, рендеру и производительности. В тот момент я решил написать эту статью.

Сегодня я расскажу о разработке культовой инди-игры The Binding of Isaac и разберу технические нюансы: путь от Flash к C++, как собирается план этажа, как устроены большие комнаты и секретки, по каким правилам живут эффекты предметов и их синергии, как Lua-скрипты встраиваются в движок для модов, где в архитектуре сделаны осознанные компромиссы.

Читать полную историю

Эволюция подходов к написанию корутин от Си до С++20. Часть 1. Функция+макросы=корутина

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

Когда речь заходит о корутинах (сопрограммах) на С++, большинство программистов вспоминает фреймворк coroutine_ts, появившийся в стандарте С++20. Многие даже не догадываются о том, что писать корутины можно было задолго до появления упомянутого стандарта. При этом можно было использовать не только С++, но и Си. Данной статьей я открываю серию, в которой хочу описать свой личный опыт изучения корутин и привести примеры их использования. Надеюсь мои статьи помогут начинающим разобраться в этой сложной и интересной теме.

Читать далее

Сам себе breakpoint

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

Когда отлаживаешь программу, речь идет про использование отладчика в студии или другой IDE, то почти всегда имеешь дело с точками останова (breakpoint, бряками) — механизмом, когда выполнение программы приостанавливается, чтобы можно было заглянуть внутрь и понять, что происходит. Точек останова есть всего два основных типа, программные и аппаратные, а остальные все сделаны на их основе. Эти два базовых типа могут вести себя похоже, но устроены по-разному.

Программные точки останова — это то, с чем сталкивается каждый разработчик, когда вы ставите красную точку в среде разработки (в основном я использую большую студию) или используете команду bp под WinDbg. В этом случае отладчик просто подменяет один байт машинного кода в нужной инструкции на команду int 3. Это специальная инструкция для вызова прерывания отладки (Debug Interrupt), имеет машинный код 0xCC и говорит процессору: “Остановись, я хочу передать управление отладчику”, соответственно когда выполнение доходит до этой инструкции, срабатывает прерывание, и управление передаётся в отладчик. Отладчик "просыпается" и видит, что программа остановилась из-за исключения EXCEPTION_BREAKPOINT , возникшего по конкретному адресу, проверяет свой внутренний список точек останова и находит ту, которая была установлена по этому адресу.

Читать далее

Вычисление производных высших порядков полинома Ньютона

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

Вычисление производных высших порядков полинома Ньютона

Интерполяция — задача восстановления функции по заданному дискретному набору её значений. При этом предполагается, что исходная функция является непрерывной на рассматриваемом отрезке. Одним из методов её решения является интерполяционный полином Ньютона.

Читать далее

Управляем зависимостями Cи и C++ через Nix

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

Рассказ о самой полезной части Nix — управление пакетами из репозитория nixpkgs.

Я использовал и использую разные языки. В Rust есть прекрасный пакетный менеджер cargo и инсталлятор rustup, для JavaScript — npm. Мне также нравится conda в мире Python.

Мне всегда не хватало чего-то подобного для проектов на Си и C++. Пакетные менеджеры для этих языков часто оставляют желать лучшего. Даже если они работают, в их репозиториях может не быть нужных библиотек. Даже если вроде всё работает хорошо, может оказаться, что для работы бинарного кэширования нужно прилагать усилия, а когда это что-то вроде разных версий Qt — собирать всё на машине разработчика неприятно.

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

Поэтому я расскажу, как использовать Nix в качестве пакетного менеджера для Си и C++.

Читать далее

Rust + C++ через FFI: как подружить два мира и не сойти с ума

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

Сегодня Rust активно используется не только как язык для написания приложений, в том числе системных, но и как язык для написания библиотек, которые подключают к существующим проектам на C и C++. Это удобно: новую функциональность можно писать на Rust, но при этом не переписывать весь код на нём.

В омут FFI

Сборка AppImage: Пошаговое руководство с готовыми скриптами

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

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

Читать далее

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