Обновить
3
0.1
Сергей @gres_84

C++ Developer

Отправить сообщение

Современный C++23/26: концепты, корутины и многое другое в высокопроизводительных службах

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

C++ уже десятки лет является краеугольным камнем, на котором строятся программы, ориентированные на высокую производительность. Он лежит в основе самых разных проектов, относящихся практически ко всем аспектам человеческой деятельности — от встроенных систем до платформ высокочастотной торговли. Его возможности по совмещению низкоуровневых средств управления вычислительными ресурсами с высокоуровневыми абстракциями превращают его в уникальный инструмент, подходящий для создания программ, при выполнении которых значение имеет каждая микросекунда. По мере того, как язык развивается, новые стандарты, вроде C++23 и ожидаемого C++26, вводят в него функционал, который улучшает и его возможности по созданию высокопроизводительных программ, и продуктивность пользующихся им программистов. Особенно это касается разработки высокопроизводительных служб — систем, которым требуются низкие задержки и высокие значения пропускной способности, которые нуждаются в эффективном использовании ресурсов. Среди них — аналитические системы, работающие в режиме реального времени, игровые серверы и распределённые системы управления базами данных.

Читать далее

Дискретное преобразование Фурье в живых картинках для девятиклассников

Уровень сложностиСредний
Время на прочтение19 мин
Просмотры35K

Мало что настолько меня угнетает, как невозможность что‑либо понять так, чтобы потом объяснить это самому себе:) И хоть я уже давно не девятиклассник, этот период запомнился мне внезапным переходом от заучивания материала «чтобы не схватить парашу» к некоторой степени осознания «а как оно там устроено и почему именно так». Сложнее всего было с математикой и я постоянно изобретал для себя «объяснялки». Этот навык, к счастью, прижился и стал привычкой.

В виртуальную лабораторию!

Оптимизируем C++ шаблоны: от инлайнинга до модулей

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

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

Читать далее

Важнейшая модель теории вероятностей

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

Что объединяет частицу в воде, биржевой курс и кота Барсика, бродящего по району в поисках ларька с рыбой?


Всё это — примеры случайного блуждания. Эта простая модель из теории вероятностей помогает описывать самые разные явления: от диффузии молекул до принятия решений и работы алгоритмов. Она кажется интуитивной — но за ней скрывается множество нетривиальных и красивых свойств.

Мы начнём с истории открытия броуновского движения — от наблюдений Роберта Броуна до формулы Альберта Эйнштейна, которая связала наблюдаемое явление с атомной гипотезой. Покажем, как идея случайного движения превратилась из гипотезы в надёжный инструмент научного анализа.

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

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

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

Читать далее

Корутины в C++20: архитектура и практическое применение

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

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

Читать далее

Иерархия мультивселенных и Конечный ансамбль Макса Тегмарка. Космологическая интерпретация квантовой механики

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

Вспомните свои самые заветные мечты и самые безумные фантазии. Если вам кажется, что они неосуществимы, не нужно отчаиваться. В нашем мире возможно всё, что не противоречит законам физики. Более того, если предположить, что Вселенная бесконечна в пространстве или во времени, то эти фантазии уже где-то или когда-то осуществились, причём бесконечное число раз. Конечно, слабо утешает, что богатым и счастливым стали не вы, а ваш двойник, проживающий от вас на расстоянии порядка 10^10^28 м. Всё-таки непривычно осознавать, что в бесконечной Вселенной существует бесконечное число ваших копий. Но даже если ограничиться наблюдаемой Вселенной с её космологическим горизонтом, в её пределах тоже может произойти много интересного. Любой мыслимый материальный объект и любой жизненный сценарий обязательно реализуется, если подождать достаточно долго. Вопрос лишь в том, насколько долго. В любом случае за время, равное 10^10^120 лет, Вселенная успеет побывать во всех своих возможных состояниях и перебрать все возможные комбинации элементарных частиц. Какая-то из них и будет воплощением вашей мечты.

Приглашаю вас на экскурсию по всем четырём уровням мультивселенной Макса Тегмарка!

Читать далее

Может ли звук охлаждать?

Время на прочтение7 мин
Просмотры3.7K
image

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

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

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

Nomina nuda tenemus: открываем ли мы математические законы или просто придумываем их?

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

Diva Philippica, vox ubi coelica nunc Ciceronis?
Pax ubi civibus atque rebellibus ira Catonis?
Nunc ubi Regulus aut ubi Romulus aut ubi Remus?
Stat Roma pristina nomine, nomina nuda tenemus.

Божество филиппик, где ныне небесный голос Цицерона?
Мир где для граждан, а для мятежников где гнев Катона?
Где же Регул, где Ромул, где Рем?
От Рима осталось лишь имя. Имена, что мы держим — пустые.

Отсылкой к последней строке этого стихотворения Бернарда Клюнийского заканчивается "Имя розы" - знаменитый роман итальянского писателя-постмодерниста, философа и медиевиста Умберто Эко. В этом произведении одной из сюжетных линий идёт спор монахов-схоластов об истинности реализма и номинализма или, иначе говоря, о реальности абстрактных идей и математических структур. Именно об этом философском споре, растянувшемся на тысячелетия, я и хотел бы поговорить в своём сегодняшнем эссе. Последние слова великолепного стихотворения, которое в полном варианте на языке оригинала можно послушать здесь, дали название не только роману Умберто Эко, но и этому посту. Nomina nuda tenemus - "имена, что мы держим, пустые".

Читать далее

Правда и мифы о Большом взрыве. Инфляционная модель мультивселенной

Уровень сложностиСредний
Время на прочтение41 мин
Просмотры7.3K

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

Что же мы видим? Теорию Большого взрыва понимают и признают единицы – остальные в лучшем случае сомневаются, а в худшем – активно её отрицают, изобретая новые мифы, выискивая тайные смыслы в старых и повторяя одни и те же глупые вопросы. А был ли Большой взрыв? Что было до Большого взрыва? Как всё могло образоваться из ничего? Неужели Вселенная – бесплатный обед? Или у неё обязательно должен быть Творец? Почему Вселенная расширяется, а мы – нет? Где записан генетический код Вселенной? Что происходило в первые секунды жизни Вселенной? Большой взрыв уже закончился или продолжается до сих пор? И кому ещё, как не Универсальному объяснителю, придётся терпеливо давать на них ответы в этой статье, опровергая популярные заблуждения? Ну, раз больше некому – поехали!

Читать далее

Доступ к приватным методам класса в С++

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

В C++ инкапсуляция — один из ключевых принципов ООП, и приватные (private) члены класса защищены от прямого доступа извне. Однако иногда возникают ситуации, когда такой доступ необходим (например, при тестировании, сериализации или отладке). Обычно для этого используют friend-функции или геттеры/сеттеры, но есть и более экзотический способ — использование шаблонов и указателей на члены класса.

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

Читать далее

Квантовый дуализм и реальность на языке информации

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

Почему фотоны исчезают в тёмных полосах интерференции? Что значит — «каждый фотон интерферирует только с самим собой»? И как природа вообще позволяет одному и тому же объекту вести себя как частица и как волна одновременно — пока вы на него не смотрите?

Эта статья — попытка аккуратно, но живо разобрать то, что Фейнман называл «единственной настоящей загадкой квантовой механики». Без мистики, без занудства — с ясными объяснениями, визуализацией, реальными экспериментами и последними интерпретациями, включая квантовый ластик, многомировую картину и информационную природу реальности.

Для тех, кто хочет не просто услышать про двойную щель, а наконец понять, что там происходит.

Вперед, к квантовой информации

Классификация парадигм программирования

Уровень сложностиПростой
Время на прочтение6 мин
Просмотры7.2K

Здравствуйте, меня зовут Дмитрий Карловский и я.. придерживаюсь следующей парадигмы мышления: всякое определение должно иметь чёткую границу между тем, что ему соответствует, и тем, что не соответствует.

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

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

Аспекты классификации

Senders/Receivers в C++26: от теории к практике

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

Каждому C++-разработчику приходится решать задачи асинхронности — от сетевых запросов до фоновых вычислений. В этой статье вы увидите, как P2300-модель Senders/Receivers в C++26 расширяет возможности std::async/std::future и позволяет строить ясные, декларативные конвейеры (then, when_all, upon_error и др.).

Читать далее

Каламический космологический аргумент и первопричина всего

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

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

  1. Всё, что когда-либо появлялось, имеет причину.
  2. Вселенная появилась в какой-то момент времени.
  3. Следовательно, Вселенная имеет причину — её кто-то создал.

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

Неубедительно? ОК, давайте раскроем аргумент поподробнее.
Читать дальше →

Язык мироздания — теория групп и теория категорий

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

Около полутора лет назад я опубликовал на Хабре статью под названием "Слово Божие — функциональное программирование как основа Вселенной", в которой я рассказывал про лямбда-исчисление и про то, как программу любой сложности можно свести к алгоритму на базе всего трёх SKI-комбинаторов или же одного единственного йота-комбинатора. В ней мы разобрались с алфавитом божественного языка, на котором написана книга мироздания. Теперь же пришло время разобраться с его грамматикой.

Читать далее

RAII 2.0: RAII как архитектурный инструмент в C++

Уровень сложностиСредний
Время на прочтение7 мин
Просмотры5.6K

Идиома RAII — давно зарекомендовал себя как удобный способ автоматического управления ресурсами в C++. Обычно мы применяем его для управления памятью, файловыми дескрипторами или мьютексами. Однако что, если расширить понятие RAII до управления не только физическими ресурсами, но и логическими контрактами и состояниями системы?

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

Читать далее

Game++. Work hard

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

Разнесение выполнения (concurrent) систем играют ключевую роль в играх — от обновления поведения ИИ и физики до рендеринга и загрузки ресурсов. Разные модели параллелизма позволяют по-разному организовать работу потоков, распределяя задачи и определяя, как потоки взаимодействуют между собой для достижения общей цели. Правильно выбранная модель влияет не только на производительность, но и зачастую на стабильность игры.

Модели выполнения используются разные — от простой многопоточности с ручной синхронизацией до более продвинутых систем акторов, job-based подходов или task graph. Например, системы поведения ИИ могут обновляться параллельно с физикой, пока основной поток отвечает за рендеринг. Некоторые движки, такие как Unreal Engine, используют task graph (граф задач), где зависимости между задачами выражаются явно, и задачи автоматически распределяются по доступным ядрам. Другие подходы, как в CryEngine Perth (аналог ECS, матрица задач), позволяют организовать данные так, чтобы минимизировать ложные зависимости и повысить кэш-эффективность. Конечный выбор всегда зависит от архитектуры движка, платформы и требований конкретной задачи или группы задач.

Читать далее

Хеш-таблица и C++20

Уровень сложностиСложный
Время на прочтение6 мин
Просмотры8.2K

Рассматриваем различные «приколюхи» из C++20 на примере хеш‑мапы!

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

Читать далее статьи от @SEIka69

Как правильно готовить std::span

Время на прочтение6 мин
Просмотры7.3K

Сегодня мы поговорим про std::span и как не порезаться на острых углах C++.

Согласно определению на cppreference, шаблон класса span описывает объект, который может ссылаться на непрерывную последовательность объектов, где первый элемент последовательности находится на позиции ноль.

Вообще, с учётом того, что, начиная с С++17 мы уже знакомы с понятием string_view, можно представить, что std::span — это нечто подобное, только действующее для непрерывных участков памяти, которые ещё можно и модифицировать. Но не будем забегать вперед, обо всех свойствах по-порядку.

Читать далее

Game++. Unpacking containers

Уровень сложностиПростой
Время на прочтение40 мин
Просмотры4.3K

Независимо от того, начинаете ли вы разрабатывать свою игру или присоединяетесь к уже существующему проекту, когда приходит время оптимизировать память и заниматься разным улучшайзингом, то всегда встают одни и те же вопросы. Стоит ли использовать собственные контейнеры? Если использовать свои, то какой лучше выбрать - похожий на vector, или больше подойдет map? Является ли связный список наилучшим выбором при частых вставках и удалениях элементов? А откуда эти вставки вообще взялись, но это конечно другой вопрос.

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

Если вы не готовы писать и поддерживать свою STL, старайтесь, использовать vector, он хотя бы предсказуем по времени на всех платформах. Так вам скажет большинство разработчиков игр на C++, но проблема в том, что vector перераспределяет хранимые объекты в памяти при вставке новых элементов, а также при удалении любого элемента, кроме последнего. Это означает, что указатели на элементы вектора становятся недействительными, и тогда все зависимости и взаимодействия между элементами перестают работать.

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

Читать далее

Информация

В рейтинге
3 727-й
Откуда
Москва, Москва и Московская обл., Россия
Дата рождения
Зарегистрирован
Активность