В этой статье мы подробно разберем понятие сопрограмм (coroutines), их классификацию, детально рассмотрим реализацию, допущения и компромиссы, предлагаемые новым стандартом C++20.
Разработчик
std::atomic. Модель памяти C++ в примерах
Для написания эффективных и корректных многопоточных приложений очень важно знать какие существуют механизмы синхронизации памяти между потоками исполнения, какие гарантии предоставляют элементы многопоточного программирования, такие как мьютекс, join потока и другие. Особенно это касается модели памяти C++, которая была создана сложной таковой, чтобы обеспечивать оптимальный многопоточный код под множество архитектур процессоров. Кстати, язык программирования Rust, будучи построенным на LLVM, использует модель памяти такую же, как в C++. Поэтому материал в этой статье будет полезен программистам на обоих языках. Но все примеры будут на языке C++. Я буду рассказывать про std::atomic, std::memory_order и на каких трех слонах стоят атомики.
C++ vtables. Часть 2 (Virtual Inheritance + Compiler-Generated Code)
Перевод статьи подготовлен специально для студентов курса «Разработчик С++». Интересно развиваться в данном направлении? Смотрите запись мастер-класса «Практика использования Google Test Framework»!
Часть 3 — Виртуальное наследование
В первой и второй части этой статьи мы говорили о том, как vtables работают в простейших случаях, а затем в множественном наследовании. Виртуальное наследование усложняет ситуацию еще больше.
C++ vtables. Часть 1 (basics + multiple Inheritance)
Всем привет! Перевод статьи подготовлен специально для студентов курса «Разработчик С++». Интересно развиваться в данном направлении? Приходите онлайн 13 декабря в 20:00 по мск. на мастер-класс «Практика использования Google Test Framework»!
В этой статье мы рассмотрим, как clang реализует vtables (таблицы виртуальных методов) и RTTI (идентификацию типа времени исполнения). В первой части мы начнем с базовых классов, а затем рассмотрим множественное и виртуальное наследование.
Что такое таблица виртуальных таблиц?
test.o: In function `MyClass':
test.cc:3: undefined reference to `VTT for MyClass'
“VTT” в данном контексте означает «таблица виртуальных таблиц» (virtual table table). Это вспомогательная структура данных, используемая (в Itanium C++ ABI) при создании некоторых базовых классов, которые сами унаследованы от виртуальных базовых классов. VTT следуют тем же правилам размещения, что и виртуальные таблицы (vtable) и информация о типе (typeinfo), так что если вы получили ошибку, приведённую выше, вы можете просто мысленно подставить «vtable» вместо «VTT», и начать отладку. (Скорее всего, вы оставили неопределённой ключевую функцию класса). Для того, чтобы увидеть, почему VTT, или аналогичная структура, необходима, начнём с основ.
Концепты: упрощаем реализацию классов STD Utility
Появляющиеся в C++20 концепты — давно и широко обсуждаемая тема. Несмотря на избыток материала, накопившегося за годы (в т.ч. выступления экспертов мирового уровня), среди прикладных программистов (не засыпающих ежедневно в обнимку со стандартом) все еще остается неразбериха, что же такое С++20-концепты и так ли они нам нужны, если есть проверенный годами enable_if. Частично виной тому то, как концепты эволюционировали за ~15 лет (Concepts Full + Concept Map -> Concepts Lite), а частично то, что концепты получились непохожими на аналогичные средства в других языках (Java/С# generic bounds, Rust traits, ...).
Под катом — видео и расшифровка доклада Андрея Давыдова из команды ReSharper C++ с конференции C++ Russia 2019. Андрей сделал краткий обзор concept-related нововведений C++20, после чего рассмотрел реализацию некоторых классов и функций STL, сравнивая C++17 и С++20-решения. Далее повествование — от его лица.
Как сделать SFINAE изящным и надежным
Сегодня у нас гостевой пост Адама Балаша (Ádám Balázs). Адам является инженером-программистом в Verizon Smart Communities Hungary и занимается разработкой видеоаналитики для встраиваемых систем. Одна из его страстей — оптимизации времени компиляции, поэтому он сразу согласился написать гостевой пост на эту тему. Вы можете найти Адама в онлайне на LinkedIn.
Умножение матриц: эффективная реализация шаг за шагом
Введение
Умножение матриц — это один из базовых алгоритмов, который широко применяется в различных численных методах, и в частности в алгоритмах машинного обучения. Многие реализации прямого и обратного распространения сигнала в сверточных слоях неронной сети базируются на этой операции. Так порой до 90-95% всего времени, затрачиваемого на машинное обучение, приходится именно на эту операцию. Почему так происходит? Ответ кроется в очень эффективной реализации этого алгоритма для процессоров, графических ускорителей (а в последнее время и специальных ускорителей матричного умножения). Матричное умножение — один из немногих алгоритмов, которые позволяет эффективно задействовать все вычислительные ресурсы современных процессоров и графических ускорителей. Поэтому не удивительно, что многие алгоритмы стараются свести к матричному умножению — дополнительная расходы, связанные с подготовкой данных, как правило с лихвой окупаются общим ускорением алгоритмов.
Так как реализован алгоритм матричного умножения? Хотя сейчас существуют множество реализаций данного алгоритма, в том числе и в открытых исходных кодах. Но к сожалению, код данных реализаций (большей частью на ассемблере) весьма сложен. Существует хорошая англоязычная статья, подробно описывающая эти алгоритмы. К моему удивлению, я не обнаружил аналогов на Хабре. Как по мне, этого повода вполне достаточно, чтобы написать собственную статью. С целью ограничить объем изложения, я ограничился описанием однопоточного алгоритма для обычных процессоров. Тема многопоточности и алгоритмов для графических ускорителей явно заслуживает отдельной статьи.
Процесс изложения будет вестись ввиде шагов с примерами по последовательному ускорению алгоритма. Я старался писать максимально упрощая задачу, но не более того. Надеюсь у меня получилось…
Разрушительные исключения
Ещё раз о том, почему плохо бросать исключения в деструкторах
Многие знатоки C++ (например, Герб Саттер) учат нас, что бросать исключения в деструкторах плохо, потому что в деструктор можно попасть во время раскрутки стека при уже выброшенном исключении, и если в этот момент будет выброшено ещё одно исключение, в результате будет вызван std::terminate(). Стандарт языка C++17 (здесь и далее я ссылаюсь на свободно доступную версию драфта N4713) на эту тему сообщает нам следующее:
Принцип наименьшего действия. Часть 2
В прошлый раз мы кратко рассмотрели один из самых замечательных физических принципов — принцип наименьшего действия, и остановились на примере, который, казалось бы, ему противоречит. В данной статье мы разберемся с этим принципом немного подробнее и посмотрим, что происходит в данном примере.
Компрессия больших массивов простых чисел
Свойства простых чисел редко позволяют работать с ними иначе, чем в виде заранее вычисленного массива — и желательно как можно более объемного. Естественный формат хранения в виде целых чисел той или иной разрядности страдает при этом некоторыми недостатками, которые становятся существенными при росте объема данных.
Так, формат 16-разрядных беззнаковых целых при размере такой таблицы около 13 килобайт вмещает всего лишь 6542 простых числа: вслед за числом 65531 идут значения более высокой разрядности. Такая таблица годится разве что в качестве игрушки.
Наиболее ходовой в программировании формат 32-разрядных целых выглядит значительно солиднее — он позволяет хранить около 203 млн простых. Но такая таблица занимает уже около 775 мегабайт.
Еще больше перспектив у 64-разрядного формата. Однако при теоретической мощности порядка 1e+19 значений, таблица имела бы размер 64 экзабайта.
Излучение Хокинга возникает не на горизонте событий черных дыр
«Краткая история времени» Стивена Хокинга была одна из первых научно-популярных книг, прочитанных мною, и я ее возненавидела. Возненавидела, потому что не понимала. Фрустрация от этой книги стала одной из основных причин, почему я стала физиком — ну, по крайней мере, я знаю, кого винить в этом.
Россия, Германия и Япония готовятся к синтезу элементов 119 и 120
Периодическая таблица химических элементов (на начало 2018 года)
В этом году Лаборатория ядерных реакций имени Г.Н. Флерова в Объединённом институте ядерных исследований (ОИЯИ) в Дубне запустят новый ускорительный комплекс — Фабрику сверхтяжёлых элементов. Этот комплекс станет базой для синтеза новых химических элементов.
«Мы готовимся к синтезу первых двух элементов восьмого периода — 119-го и 120-го. Планируем начать соответствующие эксперименты в 2019 году», — сказал «Известиям» учёный секретарь Лаборатории ядерных реакций ОИЯИ Александр Карпов.
Именно в Дубне на ускорительном комплексе У-400 были открыты 113-й элемент (нихоний, Nh, получился как побочный продукт при синтезе 115-го элемента), 115-й (московий, Mc), 117-й (теннесин, Ts) и 118-й (оганесон, Og).
Жизнь внутри черной дыры
Для тех, кто не следил за темой. Рассмотрим две вращающихся друг вокруг друга чёрных дыры, допустим, массами 15 и 20 единиц (масс Солнца). Рано или поздно они сольются в одну черную дыру, но её масса будет не 35 единиц, а, скажем, всего 30. Остальные 5 улетят в виде гравитационных волн. Именно эту энергию улавливает гравитационный телескоп LIGO.
Суть идеи Горькавого и Василькова в следующем. Допустим, вы наблюдатель, сидите в своём кресле и чувствуете притяжение 35 единиц массы делить на квадрат расстояния. И тут бац — буквально за секунду их масса уменьшается до 30 единиц. Для вас, в силу принципа относительности, это будет неотличимо от ситуации, когда вас отбросило в обратном направлении с силой в 5 единиц, делить на квадрат расстояния. То есть, неотличимо от антигравитации.
Что такое протон, и что у него внутри?
Рис. 1: атом водорода. Не в масштабе.
Вы знаете, что Большой адронный коллайдер в основном занимается тем, что сталкивает друг с другом протоны. Но что такое протон?
В первую очередь – ужасная и полная неразбериха. Настолько же уродливая и хаотичная, насколько прост и элегантен атом водорода.
Но что тогда такое атом водорода?
Это простейший пример того, что физики называют «связанным состоянием». «Состояние», по сути, означает некую штуку, существующую довольно долгое время, а «связанное» означает, что её компоненты связаны друг с другом, будто супруги в браке. На самом деле, пример супружеской пары, в которой один супруг гораздо тяжелее другого, сюда очень хорошо подходит. Протон сидит в центре, едва двигаясь, а по краям объекта движется электрон, движется быстрее, чем вы и я, но гораздо медленнее скорости света, всеобщего скоростного ограничения. Мирный образ брачной идиллии.
Или он кажется таким, пока мы не заглянем в сам протон. Внутренности самого протона больше напоминают коммуну, где плотно расположено множество холостых взрослых и детей: чистый хаос. Это тоже связанное состояние, но связывает оно не нечто простое, вроде протона с электроном, как в водороде, или хотя бы несколько десятков электронов с атомным ядром, как в более сложных атомах типа золота – но несметное количество (то есть, их слишком много и они слишком быстро меняются, чтобы их можно было подсчитать практически) легковесных частиц под названием кварки, антикварки и глюоны. Невозможно просто описать структуру протона, нарисовать простые картинки – он чрезвычайно дезорганизован. Все кварки, глюоны, антикварки, мечутся внутри с максимально возможной скоростью, почти со скоростью света.
Естественность и Стандартная Модель
Что такое «естественность?»
Что имеют в виду специалисты по физике частиц и теории струн, говоря, что определённый набор частиц и взаимодействий является «естественным»? Они не имеют в виду то, что он является «частью природы». Во Вселенной всё по определению является частью природы.
У слова «естественный» есть много значений. Учёные в нашем контексте используют не значение «связанный с природой», а значение «типичный» или «обобщённый», «ожидаемый», «обычный». Например: «естественно, ребёнок, ударившись головой, заорал», или «естественно, ближе к центру жить стоит дороже», или «я не носил эти очки много месяцев, и они, естественно, запылились». А неестественно – это когда ребёнок не кричит, когда в центре города дёшево, и когда очки чистые. Обычно, когда происходит что-то неестественное, тому есть причина.
В большинстве контекстов физики частиц и связанных с этой тем сюрпризы встречаются крайне редко. Это значит, что взглянув на физическую систему, вы увидите, что она ведёт себя так, как вы, набрав некоторого научного опыта, можете от неё ожидать. А если она так себя не ведёт, то, как показывает опыт, тому есть причина. А если эта причина неочевидна, то неестественное поведение системы может говорить о каком-то экстремальном эффекте, который вам пока неизвестен.
Квантовые флуктуации и их энергия
В квантовой теории поля квантовые флуктуации иногда называют или описывают, как «появление и исчезновение двух или более виртуальных частиц». Этот технический жаргон оказывается очень неудачным, поскольку эти штуки (как бы мы их ни называли), однозначно не являются частицами – к примеру, у них нет определённой массы – а также, поскольку понятие «виртуальной частицы» точно определяется только в присутствии относительно слабых взаимодействий.
Рис. 1
Что было бы, если бы поле Хиггса было нулевым
Он был бы смертелен для нас – в нём не было бы атомов – но в определённом смысле он был бы гораздо проще и лучше организован. Давайте посмотрим, как именно.
Рис. 2
Сравнение библиотек логирования
В сети огромное количество площадок формата Q&A где задаются вопросы из разряда:
- Предложите С++ логер? (C++ logging framework suggestions)
- Какой наиболее эффективный потоко-безопасный С++ логер? (What is the most efficient thread-safe C++ logger)
- Библиотека логирования для игр (Logging library for c games)
- Асинхронный потоко-безопасный С++ логер? (Asynchronous thread-safe logging in C++)
Люди делятся своим опытом и знаниями, но формат таких площадок позволяет лишь показать личные предпочтения отвечающего. К примеру, одним из самых производительных логеров чаще всего называют Pantheios, который даже по тестам производителя тратит больше 100 секунд на запись 1M строк лога, на современном железе это около 30 секунд, быстро ли это?
В этой статье я сравню наиболее известные и заслуженные логеры последних лет и несколько относительно молодых логеров по более чем 25 критериям.
Мост из ниоткуда: можно ли получить что-либо из ничего?
«Вопрос бытия – темнейший во всей философии». Так заключил Уильям Джеймс, размышляя над самой основной из загадок: как что-то возникло из ничего? Этот вопрос выводит из себя, решил Джеймс, поскольку требует объяснения, отрицая саму возможность его наличия. «Для перехода из ничего в бытие не существует логического моста», писал он.
В науке объяснения строятся на причинах и следствиях. Но если ничто на самом деле ничто, у него нет возможности стать причиной. Дело не в том, что мы не можем найти правильного объяснения – просто перед лицом «ничто» объяснение не работает.
Этот отказ бьёт по больному месту. Мы существа, любящие повествования. Наши простейшие понятия приходят через истории, а как нечто появилось из ничего – это самая главная история, доисторическая повесть, более фундаментальная, чем «путешествие героя» или «парень встречает девушку». Но эта история подрывает суть истории. Эта повесть соткана из самоуничтожения и парадокса.
Information
- Rating
- Does not participate
- Location
- Новосибирск, Новосибирская обл., Россия
- Date of birth
- Registered
- Activity