creator cover dalerank
dalerank

dalerank 

I love coding, games and old cars

6subscribers

4posts

About

Разработчик с более чем двадцатилетним опытом программирования и создания игр. Выпускник ИТМО, начинал свою карьеру с разработки программного обеспечения для военно-морских тренажеров, навигационных систем и сетевых решений. Последние двадцать лет специализируюсь на разработке игр: занимался оптимизацией игр The Sims и SimCity BuildIt, сделал несколько игровых систем и монстров для следующего Метро, руководил переносом игр на платформы Nintendo Switch и Apple TV, помогал с оптимизацией AoE2, Deathloop и Stellaris. Участвую в опенсорс проектах когда нахожу свободное время и восстанавливаю старенький ситибилдер Pharaoh (1999). 

Здесь вы можете поддержать разработку Фараона и мои статьи на хабре, которые я пишу время от времени. Деньги я потрачу на комп, игры и старое авто. Все статьи останутся бесплатными, поскольку я не считаю нужным прятать их под замок. Попробую выкладывать тут отдельные главы второй книги, но насколько регулярно загадывать не буду. Приятного чтения!
Нескучное программирование (0x3). Хорошие и плохие перегрузки
Level required:
Hello World of the Nile

Нескучное программирование (0х2). Обобщения условий

Теперь, когда сам алгоритм у нас есть, логично задать следующий вопрос: как сделать его обобщённым? Как превратить решение для целых чисел в алгоритм, который будет работать не только с unsigned, но и с другими типами данных?
Первый импульс обычно очень прямолинейный - хочется просто заменить конкретный тип на шаблонный параметр, условный T, и считать задачу решённой. Формально код действительно станет шаблонным, но почти сразу становится видно, что это лишь поверхностное обобщение, а не настоящее.
Возьмём, к примеру, проверку вида x < 0. Она имеет смысл только для знаковых числовых типов. Если T — беззнаковый тип, это выражение бессмысленно. Если T — матрица, вектор или пользовательский тип, такой операции может не существовать вовсе. Это первый сигнал о том, что алгоритм в своём текущем виде на самом деле жёстко привязан к конкретным типам данных.

Проблема нейтрального элемента

Другая, ещё более фундаментальная проблема связана с инициализацией результата. И если в простейшей версии алгоритма мы начинаем с единицы, что для целых и вещественных чисел выглядит естественно, то стоит выйти за пределы скалярной арифметики, и вопрос перестаёт быть тривиальным. Для матриц «единицей» является единичная матрица? А для комплексных чисел? А для пользовательских типов? Сам алгоритм не должен и не может знать, какое именно значение играет роль нейтрального элемента для умножения.
Можно попытаться решить эту проблему, введя некую глобальную функцию вроде identity(T), которая возвращает нейтральный элемент для типа Tи на первый взгляд это выглядит элегантно и даже будет работать (какое-то время), но на деле такое решение слишком жёсткое. Оно навязывает глобальное соглашение, которого может не существовать, и требует от каждого типа поддерживать нестандартный интерфейс, что сразу снижает универсальность алгоритма и делает его труднее интегрируемым в существующий код.

Нескучное программирование (0x1). Перегрузки

Года четыре назад, на стыке двух проектов, когда старый уже просто сапортили, а новый только находился в стадии препродакшена и питчингов разной степени завершенности (планирование и попыток продать концепт и идеи незаинтересованным инвесторам) у моей тогдашней команды удивительным образом появилось свободное время и где-то между обучением новичков премудростям кастомного движка, попытками переключаться на 20-ый стандарт и ретроспективой бэклога, солнечным сентябрьским утром родилась идея сделать студийные обсуждения в стиле подкаста PVC по теории С++, чтобы понять, какие возможности реализованы в движке, какие компетенции есть у пополнения и вообще как-то освежить теорию. Так родился мини-курс внутристудийных лекций от разных людей с разным, но реальным опытом применения, позже осевший в местной вики в виде набора статей, бест практис или вообще заметок с упором на игродевовскую тематику. Чтобы все это добро не пропадало, ибо человекочасов туда было вбухано порядком, я решил эти заметки облагородить и выложить в читаемом виде (видео к сожалению не будет, ибо НДА и всяческие спойлеры проектов и местной кухни разработки, да и никто не будет эти десятки часов болтовни слушать), но сами принципы языка и его особенностей вещь копирайту неподвластная, поэтому в таком виде вроде можно. Если подобный формат "зайдет" аудитории Хабра, можно будет продолжить статьи в виде небольшого цикла, как это получилось с серией Game++. К сожалению, начнем не с обобщенного программирования, а со второго подкаста про перегрузки, потому что первые записи оказались испорчены и на их восстановление потребуется время. Итак перегрузка в С++, не так как её учат в универе и дают в книжках...
Subscription levels7

Hello World of the Nile

$1.78 per month
Первый шаг на пески Нила++. Здесь ещё можно писать printf, верить в простые решения и не знать, что такое ABI. Тир для тех, кто только начинает путь — наблюдает, читает, и аккуратно проверяет, что код хотя бы компилируется.

constexpr Писец

$3.6 per month
Пишет код так, чтобы он выполнялся ещё до запуска программы. Любит чистые структуры, ясные намерения и понимает, зачем вообще нужен constexpr. Его таблички из камня уже содержат ответы, но компилятор всё еще нужен.

Хранитель Undefined Behavior

$7.2 per month
Знает, где живёт UB, как оно выглядит и почему сегодня оно «почему-то работает». Наступал на все грабли и теперь с хитрецой наблюдате за повторением этих ошибок. Иногда исправляет баг, просто переставив строчки местами.

Верховный Жрец Оптимизаций

$14.3 per month
Говорит на языке кэшей, пайплайнов и профилировщиков. Сначала измеряет, потом ещё раз измеряет, и только потом оптимизирует. Верит в O4, LTO и священный ритуал “сначала Tracy, потом PIX”.
Subscription Spots Are Limited

Фараон Метапрограммирования

$28.5 per month
Повелевает шаблонами, концептами и типовой магией, из-за код компилируется долго, но выглядит красиво. Не боится requires, умеет читать сообщения об ошибках и иногда пишет такой C++, что даже компилятор задумывается.
Subscription Spots Are Limited

Compile-times Seth

$57 per month
Божество сборки и разрушения шаблонов. Повелитель минут ожидания и тысяч инстанциаций. Если он доволен, то проект собирается быстро, но может заставить компилятор страдать. Говорят, однажды он ускорит билд, просто удалив один #include.
Subscription Spots Are Limited

Akhenaten Ruler

$114 per month
Уровень для разработчиков и энтузиастов, которым мало просто читать и они хотят влиять на то, какие системы будут разбираться и исследоваться дальше.
Go up