Обновить
128K+

C++ *

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

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

Meta Crush Saga: игра, выполняемая во время компиляции

Время на прочтение21 мин
Охват и читатели11K
image

В процессе движения к долгожданному титулу Lead Senior C++ Over-Engineer, в прошлом году я решил переписать игру, которую разрабатываю в рабочее время (Candy Crush Saga), с помощью квинтэссенции современного C++ (C++17). И так родилась Meta Crush Saga: игра, которая выполняется на этапе компиляции. Меня очень сильно вдохновила игра Nibbler Мэтта Бирнера, в которой для воссоздания знаменитой «Змейки» с Nokia 3310 использовалось чистое метапрограммирование на шаблонах.

«Что ещё за игра, выполняемая на этапе компиляции?», «Как это выглядит?», «Какой функционал C++17 ты использовал в этом проекте?», «Чему ты научился?» — подобные вопросы могут прийти к вам в голову. Чтобы ответить на них, вам придётся или прочитать весь пост, или смириться со своей внутренней ленью и посмотреть видеоверсию поста — мой доклад с Meetup event в Стокгольме:


Примечание: ради вашего психического здоровья и из-за того, что errare humanum est, в этой статье приведены некоторые альтернативные факты.

Доклады с Минской С++ конференции CoreHard Spring 2018

Время на прочтение4 мин
Охват и читатели7K

7 — 8 апреля сообщество CoreHard провело в Минске восьмую международную конференцию CoreHard Spring 2018, посвященную языку С++ и сопутствующим «хардкорным» технологиям. В конференции участвовали спикеры из ведущих IT-компаний Беларуси, России, Украины, Германии и Голландии. Они рассказали о своем опыте в разработке и тестировании.

Теперь доклады с конференции размещены в свободном доступе на YouTube и все желающие могут познакомиться с ними. Благодарим организаторов конференции.
Читать дальше →

Особенности вызова функций в С++

Время на прочтение33 мин
Охват и читатели66K

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


  • Регистры и их назначение при вызове функций.
  • Передача и возврат простых типов и структур.
  • Как передача по ссылке и по значению влияют на оптимизации тела функции компилятором.
  • Как используется место при многочисленных вызовах функций.
  • Механизм виртуальных вызовов.
  • Оптимизация хвостовых вызовов и рекурсии.
  • Инициализация структур, массивов и векторов.

Осторожно! Статья содержит большое количество кода на C++ и ассемблере (Intel ASM с комментариями), а также множество таблиц с оценками производительности. Всё написанное актуально для x86-64 System V ABI, который используется во всех современных Unix операционных системах, к примеру, в Linux и macOS.

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

1. По мотивам Мейерса «Эффективный и современный c++» — вывод типа шаблона

Время на прочтение3 мин
Охват и читатели12K

Добрый день, дорогой читатель!


Эта статья — первая в цикле статей-конспектов, которые я буду писать по ходу прочтения книги Скотта Мейерса "Эффективный и современный c++". Каждой из таких статей будет соответствовать отдельная директория в специально заведенном на github.com проекте с примерами использования описываемых возможностей и приемов.

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

Смешанный десятично-двоичный формат vs IEEE754

Время на прочтение5 мин
Охват и читатели6.5K
В предыдущем топике был рассмотрен новый формат представления десятичных чисел с плавающей точкой, который мы назвали смешанным десятично-двоичным форматом (СДДФ).

Данный формат позволяет производить арифметические вычисления на компьютере без использования BCD с такой же точностью, как если бы вычисления велись вручную.
Напомним, что смешанным десятично — двоичным форматом (СДДФ) называется формат представления десятичных чисел с плавающей точкой двоичным кодом, в котором целочисленная мантисса является двоичным эквивалентом своего десятичного значения, а экспонента является двоичным эквивалентом степени числа 10. Вещественное число в СДДФ представляется в виде

$F=SM_{2}10^{e}$


где $M_{2}$ и e — целые двоичные числа. Под двоичным эквивалентом десятичного числа подразумевается двоичный код этого десятичного числа в выбранном формате. Под десятичным эквивалентом двоичного числа подразумевается десятичный код этого двоичного числа.
Читать дальше →

Апгрейдим текстовые протоколы до бинарных и боремся с legacy-кодом на встрече C++ User Group

Время на прочтение2 мин
Охват и читатели3.7K
Приглашаем вас на очередную встречу C++ User Group, которая пройдет 28 июня в рамках нашей event-платформы CoLaboratory. В прошлый раз мы обсуждали перформанс и Clang Static Analyser. Теперь поговорим о наболевшем: как избавиться от legacy-кода? Как избежать его образования в дальнейшем? Какие сложности возникают при апгрейде протокола взаимодействия, и как с ними справиться?
Читать дальше →

Использование Docker для сборки и запуска проекта на C++

Время на прочтение5 мин
Охват и читатели57K

В этой публикации речь пойдет о том, как выполнить сборку C++ проекта, использующего GTest и Boost, при помощи Docker. Статья представляет собой рецепт с некоторыми поясняющими комментариями, представленное в статье решение не претендует на статус Production-ready.


Зачем и кому это может понадобиться?


Предположим, что вам, как и мне очень нравится концепция Python venv, когда все нужные зависимости расположены в отдельной, строго определенной директории; или же вам необходимо обеспечить простую переносимость среды сборки и тестирования для разрабатываемого проекта, что очень удобно, например, при присоединении нового разработчика к команде.


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


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

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

Chain of Responsibility на C++ variadic templates

Время на прочтение3 мин
Охват и читатели7.2K
Речь пойдёт о таком простом, но часто используемом паттерне как chain of responsibility(цепочка ответственности). Суть паттерна в том, что для обработки какого либо события мы используем несколько обработчиков, каждый из которых принимает решение о том, что и когда передавать следующему. В сети есть масса примеров реализации на C++, но я хочу показать реализацию только на лямдба-выражениях. В этой реализации можно будет посмотреть немного уличной template-magic.
Читать дальше →

Как не надо писать код

Время на прочтение4 мин
Охват и читатели37K

image


Готовы погрузиться с головой в дивный мир программирования? Хотите узнать как непредсказуемо могут повести себя несколько простых строк кода?


Если ваш ответ "Да!" — добро пожаловать под кат.


Вас будут ждать несколько занимательных задачек на С или С++.


Правильный ответ с объяснением всегда будет спрятан под спойлером.


Удачи!

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

Использование платы Firefly-RK3288 Reload с SoC RockChip RK3288. Цифровой I2C термодатчик Microchip — MCP9808

Время на прочтение9 мин
Охват и читатели13K

Firefly-RK3288 Reload


Подбирая девелоперскую плату для опытов, выбор пал на достаточно навороченную модель от китайского производителя T-Chip. Реализуют продукцию они под маркой Firefly. Специализируются на платах с системами на чипе от RockChip. RK3288 — самое производительное 32-битное решение от этой китайской компании. SoC от RockChip и Allwinner выгодно отличаются от чипов Broadcom в RaspberryPi не только лучшими характеристиками, но и технологией производства — 28nm против 40nm. Но конечно и стоят в данном случае китайцы дороже. Ещё более крутую 64-битную систему RK3399 не выбрал, в том числе потому, что есть основания полагать, что она уже существенно горячее. В то время как RK3288 под нагрузкой не сильно греется, даже без использования каких-либо радиаторов.

Страница продукта. Основные аппаратные параметры девайса: 4 ядра ARM Cortex-A17 1,8 ГГц (некоторые источники настаивают, что тут Cortex-A12 или A15, но это не особо важно), 2 ГБ DDR3 dual-channel, накопитель 16 ГБ eMMC, гигабитный Ethernet.

Общий вид

Покупал на Ebay, это оказалось чуть ли не единственным местом, где эти платы можно заказать в Россию. Интернет магазин самого китайского Firefly в Россию не высылает. Не высылает в Россию и Indiegogo. Что забавно, в списке стран для отправки, у этих странных людей якобы есть даже ныне не существующие государства :). Продавец с Ebay прислал плату в хорошей комплектации — плата, блок питания (нужен 12V 1,5A, прислали как и положено с запасом — 2A), платка с антенной, акриловые панели корпуса с крепежом. Адаптер правда под американскую розетку, но ведь все должны иметь походный переходник :).
Читать дальше →

Колоночные СУБД против строчных, как насчет компромисса?

Время на прочтение7 мин
Охват и читатели33K

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

Отладочная плата STM32F4 в форм-факторе Raspberry Pi

Время на прочтение20 мин
Охват и читатели29K

image Добрый день, уважаемые хабровчане! Хочу представить общественности мой проект — небольшая отладочная плата на базе STM32, но в форм-факторе Raspberry Pi. От других отладочных плат она отличается тем, что имеет совместимую с корпусами от Raspberry Pi геометрию и наличие ESP8266-модуля в качестве беспроводного модема. А также приятные дополнения в виде разъёма для micro-SD карты и стерео-усилителя. Для использования всего этого богатства я разработал высокоуровневую библиотеку и демонстрационную программу (на C++11). В статье я хочу подробно описать как аппаратную, так и программную части этого проекта.

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

Бьёрн Страуструп: Проблема с программированием

Время на прочтение8 мин
Охват и читатели52K
image

Статья 2006 года.

Бьёрн Страуструп, изобретатель языка программирования C++, защищает свое наследие и рассказывает, что не так с большей частью программного кода.

В 1980-х и 90-х годах Бьёрн Страуструп разработал и внедрил язык программирования C++, который популяризировал объектно-ориентированное программирование и повлиял на многие другие языки программирования, включая Java.

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

Страуструп, на протяжении многих лет работающий в AT&T Bell Labs, теперь является профессором компьютерных наук на факультете инженерии в Техасском университете A&M, недалеко от Хьюстона.

Технологический обзор: почему большая часть программного обеспечения настолько плоха?

Бьёрн Страуструп: Некоторые программы на самом деле довольно хороши по любым стандартам. Подумайте о Mars Rovers, Google и проекте “Геном человека”. Это качественное программное обеспечение! Пятнадцать лет назад большинство людей, и в частности большинство экспертов, сказали бы, что каждый из этих примеров невозможен. Наша технологическая цивилизация зависит от программного обеспечения, поэтому, если бы программное обеспечение было бы в действительности таким же плохим, как и его наихудшая репутация, большинство из нас уже были бы мертвы.
Читать дальше →

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

Личный опыт: переход с низкоуровневой разработки на C к программированию на Java

Время на прочтение26 мин
Охват и читатели48K


Статья отражает личный опыт автора – заядлого программиста микроконтроллеров, которому после многолетнего опыта микроконтроллерной разработки на языке С (и немного на С++) довелось участвовать в крупном Java-проекте по разработке ПО для ТВ-приставок под управлением Android. В ходе этого проекта удалось собрать заметки об интересных различиях языков Java и C/C++, оценить разные подходы к написанию программ. Статья не претендует на роль справочника, в ней не рассматривается эффективность и производительность Java-программ. Это скорее сборник личных наблюдений. Если не указано иное, то речь идет о версии Java SE 7.
Читать дальше →

Двоичные вычисления для десятичной арифметики

Время на прочтение6 мин
Охват и читатели12K
Продолжая исследовать проблему точности десятичных вычислений средствами двоичной арифметики, начатую в предыдущих постах [1,2,3,4], мне удалось разработать алгоритмы вычисления вещественных чисел, представленных в формате десятичных чисел с плавающей точкой, которые дают такой же точный результат, как если бы вычисления велись вручную.
Читать дальше →

10 советов для продуктивности в CLion, кроссплатформенной С/С++ IDE

Время на прочтение6 мин
Охват и читатели20K
Всем привет!

До выпуска нашей первой группы курса «Разработчик C++» остались считанные дни. По итогам неплохо поработали напильником и надфилем над курсом: перекомпоновали домашние задания, обновили версию язык и ещё разное по мелочи. Ну, а пока продолжаем нашу традицию по интересным и полезным материалам.

Поехали.

Судя по собственному опыту разработки, многие разработчики C/C++ пренебрегают идеей, что IDE может сделать их работу продуктивней. Ведь что может быть лучше, чем простые и быстрые Vim или Emac. Что ж, позвольте продемонстрировать. Эти 10 советов CLion поднимут вас на новый уровень продуктивности, помогут сфокусироваться на важных и сложных задачах, в то время как IDE решит за вас рутинные задачи.

Прежде чем начать, познакомимся с CLion, новой кроссплатформенной IDE для разработки на C и C++, созданной JetBrains. Она изначально поддерживает C и C++, включая стандарт C++11 (с некоторыми небольшими ограничениями), libc++ и Boost. Она корректно обрабатывает макросы и шаблоны, а также работает с GCC или Clang (при работе с Windows понадобится или MinGW/MinGW-w64, или Cygwin), GDB, как встроенный дебаггер, и CMake, как система сборки и проектная модель. В дополнении к C/C++ также можно пользоваться JavaScript, XML, HTML и CSS на том же уровне редактирования кода, используя, например, подсветку синтаксиса, анализ, автодополнение, навигацию и рефакторинг.

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

Портируем код с Qt 1.0 на Qt 5.11

Время на прочтение5 мин
Охват и читатели15K
Недавно вышел Qt 5.11 и мне подумалось, что сейчас самое время обновить до него кое-какие мои проектики на Qt 1.0… Ладно, шучу :) На самом деле мне стало интересно, насколько хорошо за все эти годы развития фреймворка Qt нам удавалось сохранять обратную совместимость кода.

Qt гарантирует совместимость на уровне кода и бинарников при обновлении между минорными версиями фреймворка (и мы серьёзно относимся к этому обещанию). Вы не должны переписывать (или даже перекомпилировать) свой код при переходе на другую минорную версию Qt. Однако переходы между мажорными версиями требовали от нас идти на некоторые жертвы ради прогресса. С релиза Qt 1.0 в 1996 году мы ломали совместимость кода четыре раза: в версиях 2.0, 3.0, 4.0 (ох, это было болезненно!) и 5.0.

Мы старались даже в мажорных версиях сломать как можно меньше всего, но всё же это приходилось делать. Отсюда возникает вопрос: насколько сложно портировать приложение, написанное во времена Qt 1.0 до современного Qt 5.11?

Для ответа на этот вопрос я взял пример кода, который поставлялся с документацией на Qt 1.0 и постарался собрать его с помощью Qt 5. Наши публичные архивы содержат изменения начиная с версии 1.41, так что мне пришлось изрядно покопаться в дрейнейшей истории, пройти через логи четырёх разных систем контроля версий… но это я уже отвлекаюсь. Проект, который я планирую собрать, называется «t14» — поскольку это иллюстрация к 14-ой (и последней) главе оригинального руководства.

И вот, что мне пришлось проделать для его сборки.
Читать дальше →

Использование std::optional в С++17

Время на прочтение11 мин
Охват и читатели113K


Давайте возьмём пару от двух типов <YourType, bool> — что вы можете сделать с композицией подобного рода?


В этой статье я расскажу вам про std::optional — новый вспомогательный тип, добавленный в C++17. Это обёртка для вашего типа и флаг показывает, инициализировано ваше значение или нет. Давайте посмотрим, где это может быть полезно.


Вступление


Добавлением логических флагов к другим типам вы можете достичь то, что называется "Nullable типы". Как было сказано ранее, флаг используется для обозначения того, доступно значение или нет. Такая обёртка выразительно представляет объект, который может быть пустым (не через комментарии :).

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

Рефакторинг с использованием C++17 std::optional

Время на прочтение6 мин
Охват и читатели18K


В разработке существует множество ситуаций, когда вам надо выразить что-то с помощью "optional" — объекта, который может содержать какое-либо значение, а может и не содержать. Вы можете реализовать опциональный тип с помощью нескольких вариантов, но с помощью C++17 вы сможете реализовать это с помощью наиболее удобного варианта: std::optional.


Сегодня я приготовил для вас одну задачу по рефакторингу, на который вы сможете научиться тому, как применять новую возможность C++17.


Вступление


Давайте быстро погрузимся в код.


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

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

Детектирование и подсчет посетителей в режиме реального времени на одноплатном компьютере «Up-board»

Время на прочтение5 мин
Охват и читатели11K
В С++ направлении мы разработали приложение для подсчета количества посетителей на основе анализа видеопотока с видеокамеры. Его отличительной особенностью было в то, что приложение разрабатывалось как отдельный автономный модуль для запуске на плате Up Board. Это позволяет клиентам купить необходимое количество устройств и самим установить в требуемых местах. Также было разработано отдельное приложение-сервер, которое позволяло настраивать эти устройства удаленно, получать статистику с них, видеопоток и представлять данные о посетителях в удобном виде.
Читать дальше →