В предыдущей статье Где хранятся ваши константы на микроконтроллере CortexM (на примере С++ IAR компилятора), был разобран вопрос о том, как расположить константные объекты в ROM. Теперь же я хочу рассказать, как можно использовать порождающий шаблон одиночка для создания объектов в ROM.
Читать полностью »
Рубрика «c++» - 61
Синглтон размещающий объекты в ROM и статические переменные(С++ на примере микроконтроллера Cortex M4)
2019-07-05 в 11:59, admin, рубрики: c++, cortex-m, cortex-m4, IAR, singleton, микроконтроллеры stm, Программирование, программирование микроконтроллеров, шаблоны c++Новый оператор spaceship (космический корабль) в C++20
2019-07-05 в 9:45, admin, рубрики: c++, C++20, microsoft, Spaceship Operator, VC++, Блог компании Microsoft, ПрограммированиеC++20 добавляет новый оператор, названный «космическим кораблем»: <=>
. Не так давно Simon Brand опубликовал пост, в котором содержалась подробная концептуальная информация о том, чем является этот оператор и для каких целей используется. Главной задачей этого поста является изучение конкретных применений «странного» нового оператора и его аналога operator==
, а также формирование некоторых рекомендаций по его использованию в повседневном кодинге.
Simplify Your Code With Rocket Science: C++20’s Spaceship Operator
2019-07-05 в 7:00, admin, рубрики: c++, C++20, microsoft, Spaceship Operator, VC++, Блог компании Microsoft, ПрограммированиеC++20 adds a new operator, affectionately dubbed the «spaceship» operator: <=>
. There was a post awhile back by our very own Simon Brand detailing some information regarding this new operator along with some conceptual information about what it is and does. The goal of this post is to explore some concrete applications of this strange new operator and its associated counterpart, the operator==
(yes it has been changed, for the better!), all while providing some guidelines for its use in everyday code.
Введение в разработку CatBoost. Доклад Яндекса
2019-07-04 в 9:25, admin, рубрики: c++, catboost, open source, python, Блог компании Яндекс, градиентный бустинг, деревья решений, матрикснет, машинное обучениеМеня зовут Стас Кириллов, я ведущий разработчик в группе ML-платформ в Яндексе. Мы занимаемся разработкой инструментов машинного обучения, поддержкой и развитием инфраструктуры для них. Ниже — мой недавний доклад о том, как устроена библиотека CatBoost. В докладе я рассказал о входных точках и особенностях кода для тех, кто хочет его понять или стать нашим контрибьютором.
— CatBoost у нас живет на GitHub под лицензией Apache 2.0, то есть открыт и бесплатен для всех. Проект активно развивается, сейчас у нашего репозитория больше четырех тысяч звездочек. CatBoost написан на C++, это библиотека для градиентного бустинга на деревьях решений. В ней поддержано несколько видов деревьев, в том числе так называемые «симметричные» деревья, которые используются в библиотеке по умолчанию.
Peephole микрооптимизации в С++ и C# компиляторах
2019-07-03 в 8:35, admin, рубрики: .net, C#, c++, CoreCLR, gcc, LLVM, Программирование, системное программированиеВ школе, когда мы решали уравнения или считали формулы, мы пытались их сперва сократить несколько раз, к примеру Z = X - (Y + X)
сокращается в Z = -Y
. В современных компиляторах это подмножество так называемых peephole-оптимизаций, в которых мы по, грубо говоря, набору шаблонов сокращаем выражения, заменяем инструкции на более быстрые для конкретного процессора и т.п. В этой статье я собрал наборчик таких оптимизаций, которые удалось найти в исходниках LLVM, GCC и .NET Core (CoreCLR).
Начнем с простых примеров:
X * 1 => X
-X * -Y => X * Y
-(X - Y) => Y - X
X * Z - Y * Z => Z * (X - Y)
проверим последний пример в С++ и в C#:
int Test(int x, int y, int z) {
return x * z - y * z; // => z * (x - y)
}
и посмотрим на ассемблер от Clang (LLVM), GCC, MSVC и .NET Core:
Изучаем календарь
2019-07-01 в 11:30, admin, рубрики: c++, день недели, Календарь, математика, первый день года, Программирование Эта статья получилась из вопроса, который я вчера задал сам себе.
«Существует ли год, в котором ни один месяц не начинается в понедельник?»
На первый взгляд — да. Год может начинаться с любого дня недели, месяцы тоже каждый раз начинаются в разные дни недели. Вариантов множество, скорее всего, найдётся и не один такой год.
Так я подумал в первую минуту после того, как задался вопросом. Это следовало бы доказать. Перебрать все года, например. Простой и быстрый способ, но не интересный. Доказать математически было намного более заманчивой идеей, но как к этому подступиться я совершенно не понимал. Поэтому просто начал выписывать продолжительность каждого месяца на бумагу.
Тут стоит оговорить, что речь дальше пойдёт про григорианский календарь, по которому мы живём с 1918 года. Однако часть рассуждений будет верна и для юлианского.
Читать полностью »
Зачем нужны виртуальные функции
2019-06-30 в 11:36, admin, рубрики: c++, виртуальные функции, Программирование, стили программирования, чистый кодПривет. Если ты знаешь ответ на вопрос в заголовке, – поздравляю, эта статья тебе не нужна. Она адресуется новичкам в программировании, вроде меня, которые не всегда могут самостоятельно разобраться со всеми тонкостями C++ и других типизированных языков, а если и могут, лучше всё равно учиться на чужих ошибках.
В данной статье я не просто отвечу на вопрос "Зачем нужны виртуальные функции в C++", а приведу пример из своей практики. Для краткого ответа можно обратиться к поисковикам, которые выдают примерно следующее: "Виртуальные функции нужны для обеспечения полиморфизма — одного из трёх китов ООП. Благодаря им машина может сама определить тип объекта по указателю, не загружая этой задачей программиста". О'кей, но вопрос «зачем» остался, хотя теперь он значит немного другое: "Зачем полагаться на машину, тратить лишние время и память, если можно самостоятельно подкастовать указатель, ведь тип объекта, на который он ссылается, почти всегда известен?" Действительно, кастование на первый взгляд оставляет виртуальные функции без работы, и именно оно становится причиной заблуждений и плохого кода. В мелких проектах проигрыш незаметен, но, как вы скоро убедитесь, с ростом программы касты увеличивают листинг в почти геометрической прогрессии.
Читать полностью »
Just take a look at SObjectizer if you want to use Actors or CSP in your C++ project
2019-06-30 в 8:06, admin, рубрики: actor model, actors, c++, c++17, concurrency, open source, sobjectizer, ПрограммированиеA few words about SObjectizer and its history
SObjectizer is a rather small C++ framework that simplifies the development of multithreaded applications. SObjectizer allows a developer to use approaches from Actor, Publish-Subscribe and Communicating Sequential Processes (CSP) models. It's an OpenSource project that is distributed under BSD-3-CLAUSE license.
SObjectizer has a long history. SObjectizer itself was born in 2002 as SObjectizer-4 project. But it was based on ideas from previous SCADA Objectizer that was developed between 1995 and 2000. SObjectizer-4 was open-sourced in 2006, but its evolution was stopped soon after that. A new version of SObjectizer with the name SObjectizer-5 was started in 2010 and was open-sourced in 2013. The evolution of SObjectizer-5 is still in progress and SObjectizer-5 has incorporated many new features since 2013.
SObjectizer is more or less known in the Russian segment of the Internet, but almost unknown outside of the exUSSR. It's because the SObjectizer was mainly used for local projects in exUSSR-countries and many articles, presentations, and talks about SObjectizer are in Russian.
A niche for SObjectizer and similar tools
Multithreading is used in Parallel computing as well as in Concurrent computing. But there is a big difference between Parallel and Concurrent computing. And, as a consequence, there are tools targeted Parallel computing, and there are tools for Concurrent computing, and they are different.
Опасность использования multi-character-констант
2019-06-26 в 8:59, admin, рубрики: c++, clang, gcc, pvs-studio, visual c++, Visual Studio, Блог компании PVS-Studio, разработка под windows
Во время анализа кода, PVS-Studio выполняет анализ потока данных и оперирует значениями переменных. Значения берутся из констант или выводятся из условных выражений. Мы называем их виртуальными значениями. Недавно мы улучшали их для работы с multi-character-константами и это стало поводом для создания нового диагностического правила.
Введение
Multi-character-литерал является implementation-defined, поэтому различные компиляторы могут кодировать эти литералы по-разному. К примеру, GCC и Clang задают значение, основываясь на порядке символов в литерале, тогда как MSVC перемещает их в зависимости от типа символа (обычный или escape).
Читать полностью »
How to speed up LZ4 decompression in ClickHouse?
2019-06-25 в 14:42, admin, рубрики: bayesian optimization, big data, c++, clickhouse, data compression, databases, highload, lz4, lz77, open source, performance, Блог компании Яндекс, высокая производительностьWhen you run queries in ClickHouse, you might notice that the profiler often shows the LZ_decompress_fast
function near the top. What is going on? This question had us wondering how to choose the best compression algorithm.
ClickHouse stores data in compressed form. When running queries, ClickHouse tries to do as little as possible, in order to conserve CPU resources. In many cases, all the potentially time-consuming computations are already well optimized, plus the user wrote a well thought-out query. Then all that's left to do is to perform decompression.
So why does LZ4 decompression becomes a bottleneck? LZ4 seems like an extremely light algorithm: the data decompression rate is usually from 1 to 3 GB/s per processor core, depending on the data. This is much faster than the typical disk subsystem. Moreover, we use all available CPU cores, and decompression scales linearly across all physical cores.
Читать полностью »