Как стать автором
Обновить
0
@sosimbaread⁠-⁠only

Пользователь

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

Сказ об опасном std::enable_shared_from_this, или антипаттерн «Зомби»

Время на прочтение26 мин
Количество просмотров28K
В статье приводится опасный антипаттерн «Зомби», в некоторых ситуациях естественным образом возникающий при использовании std::enable_shared_from_this. Материал — где-то на стыке техники современного C++ и архитектуры.
Читать дальше →
Всего голосов 49: ↑46 и ↓3+43
Комментарии94

Сериализация в C++

Время на прочтение14 мин
Количество просмотров41K
В данной статье речь пойдет об автоматизации процесса сериализации в C++. В начале будут рассмотрены базовые механизмы, позволяющие упростить чтение/запись данных в потоки ввода-вывода, после чего будет дано описание примитивной системы генерации кода на основе libclang. Ссылка на репозиторий с демонстрационным вариантом библиотеки расположена в конце статьи.
Читать дальше →
Всего голосов 9: ↑7 и ↓2+12
Комментарии44

Inline variables

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

Первоначальное назначение ключевого слова inline состояло в том, чтобы служить индикатором для оптимизатора, что встроенная подстановка функции предпочтительнее вызова функции, то есть вместо выполнения команды CPU для передачи управления в тело функции, копия тела функции выполняется без генерирования вызова. Эта оптимизация (inline expansion) основана на идее, что выполнение вызова функции является относительно дорогостоящим: оно требует перехода к новой подпрограмме, передачи аргументов функции и копирования возвращаемых значений. Inline expansion подавляет вызов функции путем копирования инструкций функции непосредственно в тело вызывающего объекта.

Читать далее
Всего голосов 8: ↑8 и ↓0+8
Комментарии6

C++ MythBusters. Миф о виртуальных функциях

Время на прочтение9 мин
Количество просмотров81K
Здравствуйте.

В прошлой статье я рассказывал, с какой не всем известной особенностью можно столкнуться при работе с подставляемыми функциями. Статья породила как несколько существенных замечаний, так и многостраничные споры (и даже холивары), начавшиеся с того, что inline-функции вообще лучше не использовать, и перешедшие в стандартную тему C vs. C++ vs. Java vs. C# vs. PHP vs. Haskell vs. …

Сегодня пришла очередь виртуальных функций.
Читать дальше
Всего голосов 55: ↑49 и ↓6+43
Комментарии109

Просто и на C++. Основы userver — фреймворка для написания асинхронных микросервисов

Время на прочтение6 мин
Количество просмотров40K
В Яндекс.Такси придерживаются микросервисной архитектуры. С ростом количества микросервисов мы заметили, что разработчики много времени тратят на boilerplate и типичные проблемы, при этом решения не всегда получаются оптимальные.

Мы решили сделать свой фреймворк, с C++17 и корутинами. Вот так теперь выглядит типичный код микросервиса:

Response View::Handle(Request&& request, const Dependencies& dependencies) {
  auto cluster = dependencies.pg->GetCluster();
  auto trx = cluster->Begin(storages::postgres::ClusterHostType::kMaster);

  const char* statement = "SELECT ok, baz FROM some WHERE id = $1 LIMIT 1";
  auto row = psql::Execute(trx, statement, request.id)[0];
  if (!row["ok"].As<bool>()) {
    LOG_DEBUG() << request.id << " is not OK of " << GetSomeInfoFromDb();
    return Response400();
  }

  psql::Execute(trx, queries::kUpdateRules, request.foo, request.bar);
  trx.Commit();

  return Response200{row["baz"].As<std::string>()};
}

А вот почему это крайне эффективно и быстро — мы расскажем под катом.
Читать дальше →
Всего голосов 53: ↑51 и ↓2+49
Комментарии57

Сказ о том, как я за год решил более 600 leetcode задач

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

Всем салют!

Хочу рассказать вам историю о том, как я начинал с уровня — «не могу решить даже 1 easy задачу из 10» до уровня — «могу решить каждую вторую medium задачу» и прошел несколько coding сессий в таких компаниях как Meta, Booking, Careem, Avito...

Читать далее
Всего голосов 121: ↑112 и ↓9+129
Комментарии407

Перегрузка в C++. Часть II. Перегрузка операторов

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


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


Читать дальше →
Всего голосов 12: ↑12 и ↓0+12
Комментарии17

90 рекомендаций по стилю написания программ на C++

Время на прочтение20 мин
Количество просмотров412K
От переводчика. Искал в интернете простой и легко применимый гайдлайн по написанию программ на C++. Мне понравился один из вариантов, и я решил его перевести и опубликовать. Если хабрапользователи хорошо встретят этот топик, могу перевести и другие связанные документы, а также гайдлайны по написанию кода от других компаний.

1 Введение


Настоящий документ содержит рекомендации по написанию программ на языке C++.

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

Но для появления ещё одного списка рекомендаций, помимо указанных источников, есть несколько причин. Основная причина — их излишняя обобщённость, поскольку зачастую требуется задать частные правила (в особенности правила именования). Данный документ содержит комментарии, что делает его более удобным в использовании при проведении ревизий кода, чем другие уже существующие документы. К тому же, рекомендации по программированию обычно вперемешку содержат описания проблем стиля и технических проблем, что не совсем удобно. Этот документ не содержит каких-либо технических рекомендаций по C++, делая упор на вопросах стиля.
Читать дальше →
Всего голосов 181: ↑137 и ↓44+93
Комментарии213

Приведение типов. Наглядное отличие static_cast от dynamic_cast

Время на прочтение3 мин
Количество просмотров37K
Доброго времени суток. Очень много статей в интернете о разнице операторов приведения типов, но понимания в данной теме они мне не особо то и не добавили. Пришлось разбираться самому. Хочу поделиться с вами моим опытом на довольно наглядном примере.

Статья рассчитана на тех, кто хочет осознать приведение типов в С++.
Читать дальше →
Всего голосов 23: ↑16 и ↓7+9
Комментарии16

Шпаргалка по аббревиатурам C++ и не только. Часть 1: C++

Время на прочтение20 мин
Количество просмотров56K
Когда-то я собеседовался на должность C++ разработчика в одну приличную и даже известную контору. Опыт у меня тогда уже кое-какой был, я даже назывался ведущим разработчиком у тогдашнего своего работодателя. Но на вопросы о том, знаком ли я такими вещами, как DRY, KISS, YAGNI, NIH, раз за разом мне приходилось отвечать «Нет».

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


Читать дальше →
Всего голосов 52: ↑52 и ↓0+52
Комментарии29

Популярные задачи для собеседований бэкенд-разработчиков на Go и их решения

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

Я живу в Ташкенте, и когда учился в университете — начал учить Python, чтобы писать ботов. Боты — это узбекский хлеб, у нас на них построено вообще все. Например, никто не делает приложения для заказа еды, все только в мессенджерах. 

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

Тогда я решил попробовать Go.

Читать далее
Всего голосов 36: ↑29 и ↓7+31
Комментарии17

Собеседование Golang разработчика (теоретические вопросы), Часть II. Что там с конкурентностью?

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

Что спрашивают на собеседовании Golang разработчика? Асинхронщина? Контексты? Вторая часть статьи с вопросами и ответами, собранными на собеседованиях.

Читать далее
Всего голосов 16: ↑14 и ↓2+14
Комментарии19

Собеседование Golang разработчика (теоретические вопросы), Часть I

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

Как сейчас проходят собеседования на golang разработчика? Что спрашивают?

Читать далее
Всего голосов 43: ↑42 и ↓1+45
Комментарии23

std::atomic. Модель памяти C++ в примерах

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

Для написания эффективных и корректных многопоточных приложений очень важно знать какие существуют механизмы синхронизации памяти между потоками исполнения, какие гарантии предоставляют элементы многопоточного программирования, такие как мьютекс, join потока и другие. Особенно это касается модели памяти C++, которая была создана сложной таковой, чтобы обеспечивать оптимальный многопоточный код под множество архитектур процессоров. Кстати, язык программирования Rust, будучи построенным на LLVM, использует модель памяти такую же, как в C++. Поэтому материал в этой статье будет полезен программистам на обоих языках. Но все примеры будут на языке C++. Я буду рассказывать про std::atomic, std::memory_order и на каких трех слонах стоят атомики.

Читать далее
Всего голосов 52: ↑52 и ↓0+52
Комментарии39

Размышление об Active Object в контексте Qt6. Часть 3. HttpManager

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

Во всех предыдущих статьях мы рассматривали лишь самый простой пример — сериализованный вывод сообщений на экран в отдельном потоке.

Пришло время, наконец, сделать что-то более реальное и существенное, пусть и не очень сложное. И этим будет менеджер http запросов.

Читать далее
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Курс по C++ в CS центре, вторая часть

Время на прочтение3 мин
Количество просмотров11K
Computer Science Center — это совместная инициатива Computer Science клуба при ПОМИ РАН, компании JetBrains и Школы анализа данных Яндекса.

Центр существует, чтобы дать возможность талантливым студентам и выпускникам развиваться в интересных им направлениях: Computer Science, Data Science или Software Engineering.

Курс по C ++ в двух частях в центре читает Валерий Михайлович Лесин, valery-l, преподаватель CS центра и совместной магистратуры ИТМО и JetBrains «Разработка программного обеспечения / Software Engineering», технический директор Simlabs.

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

Раскусим новые возможности языка и стандартной библиотеки: move семантику, bind/function, enable_if/if constexpr, сoroutines и другие. Посмотрим на некоторые характерные задачи: многопоточное программирование, использование библиотек в Windows и Linux и другие.

Приятного просмотра!
Смотреть видео
Всего голосов 20: ↑19 и ↓1+18
Комментарии3

Эзотерический язык, транслирующийся в шаблоны C++

Время на прочтение23 мин
Количество просмотров20K
КПДВ с примерами кода Шаблоны C++ — полный по Тьюрингу язык, на котором можно писать compile-time программы. Только вот синтаксис рассчитан на описание параметризованных типов и слабо приспособлен к ясному выражению чего-то более сложного. В этой статье рассмотрим, как типы и шаблоны становятся значениями и функциями, а также узнаем, к чему привела попытка автора создать свой функциональный язык, транслирующийся в шаблоны C++. Для прочтения текста знания в области функционального программирования почти не требуются.
Читать дальше →
Всего голосов 59: ↑59 и ↓0+59
Комментарии10

Упрощаем код с помощью if constexpr и концептов C++17/C++20

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

До C++17 у нас было несколько довольно неэлегантных способов написать static if (if, который работает во время компиляции). Например, мы можем использовать статическую диспетчеризацию или SFINAE. К счастью, ситуация изменилась к лучшему, ведь теперь мы можем воспользоваться для этого if constexpr  и концептами C++20!

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

Читать далее
Всего голосов 12: ↑10 и ↓2+9
Комментарии34

Class Template Argument Deduction

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


Стандарт C++17 добавил в язык новую фичу: Class Template Argument Deduction (CTAD). Вместе с новыми возможностями в C++ традиционно добавились и новые способы отстрела собственных конечностей. В этой статье мы будем разбираться, что из себя представляет CTAD, для чего используется, как упрощает жизнь, и какие в нём есть подводные камни.

Читать дальше →
Всего голосов 14: ↑14 и ↓0+14
Комментарии18

Восемь неочевидных вещей в шаблонах С++

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

Привет, я backend-разработчик IT-компании SimbirSoft Леонид. В этой статье расскажу про 8 нюансов, которые я обнаружил при изучении шаблонов С++. Честно признаюсь, что наткнувшись на некоторые из них, я был удивлен: «Хм, SFINAE есть, а слова нет?» или «А что, есть разница между шаблоном в шаблоне и шаблоном с двумя параметрами?».

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

Некоторые из примеров были описаны в cpp-referernce чуть ли не в самом первом абзаце, некоторые потребовали пошерстить stackoverflow, и в конце концов все есть в стандарте. Но кто учит язык по документации? У кого из нас не было такой ситуации: «Сейчас я код потыкаю, а там разберемся, что к чему». Так вот, сейчас пришло время узнать, как это работает и почему именно так. 

Читать далее
Всего голосов 22: ↑18 и ↓4+19
Комментарии5

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность