C++ — компилируемый строго типизированный язык программирования общего назначения.

Основная информация

C++ — компилируемый строго типизированный язык программирования общего назначения. Поддерживает разные парадигмы программирования: процедурную, обобщённую, функциональную; наибольшее внимание уделено поддержке объектно-ориентированного программирования.

Рейтинг: 4
Создана 5 лет назад
Владелец root

Стена группы

Загрузка...
4 года назад
#
REST сервис на C++: POCO+Angular TODO

POCO — кроссплатформенная open-source библиотека на С++ под Boost Software License: ru.wikipedia.org/wiki/POCO.
POCO имеет в своем составе средства для создания веб-сервисов c RESTful API.
В данной статье рассмотрено создание такого сервиса на примере TODO.

POCO

Простейшее приложение TODO — это список задач с возможностью добавить новую или удалить выполненную задачи.

Читать далее
4 года назад
#
Настройка проекта C++ в Eclipse на примере приложения SFML

habrahabr.ru

Всем доброго времени суток! При настройке проекта в Eclipse я столкнулся с несколькими проблемами. После попыток найти решение этих проблем, я находил очевидные советы на забугорных форумах, которые не решали проблему. Почесав затылок, я начал решать проблемы сам. В статье я детально опишу настройку Eclipse CDT, MinGW, подключение header'ов и библиотек. Статья расчитана для новичков.

Определения

Eclipse CDT — интегрированная среда разработки С и C++ на базе платформы Eclipse.

MinGW — компилятор, нативный программный порт GNU Compiler Collection (GCC) под Microsoft Windows, вместе с набором свободно распространяемых библиотек импорта и заголовочных файлов для Windows API. MinGW позволяет разработчикам создавать нативные приложения Microsoft Windows.

SFML — свободная кроссплатформенная мультимедийная библиотека, написана на C++.

Установка Eclipse и MinGW

Для работы Eclipse требуется Java.

Скачиваем Eclipse CDT с официального сайта и распаковываем в любое удобное место, например C:\eclipse. Запускаем eclipse.exe, если все заработало, прекрасно.

Далее качаем установщик MinGW. Запускаем его. Видим окно с описанием, нажимаем Install. Если нужно меняем место установки и нажимаем Continue.

Отмечаем для установки mingw-32-base и mingw-gcc-g++.

MinGW

4 года назад
#
PVS-Studio покопался во внутренностях Linux (3.18.1)

habrahabr.ru

PVS-Studio

В рекламных целях мы решили попробовать проверить ядро Linux с помощью нашего статического анализатора кода. Эта задача интересна своей сложностью. Исходные коды Linux чем только не проверялись и проверяются. Поэтому найти хоть что-то новое, весьма сложная задача. Но если получится, то это будет хорошая рекламная заметка о возможностях анализатора PVS-Studio.

Что мы проверяли

Ядро Linux было взято с сайта The Linux Kernel Archives. Проверялась Latest Stable Kernel 3.18.1.

К тому моменту, как я пишу эту статью, уже появилось ядро 3.19-rc1. К сожалению, проверка проекта и написание статьи занимают немало времени. Поэтому будем довольствоваться проверкой не самой последней версии.

Тем, кто скажет, что мы должны были проверить именно самую последнюю версию, я хочу ответить следующее.

  1. Мы регулярно проверяем большое количество проектов. Помимо бесплатной проверки проектов, у нас много других задач. И поэтому нет никакой возможности начинать всё сначала, только потому, что появилась новая версия. Так мы можем никогда ничего не опубликовать :).

  2. 99% найденных ошибок осталось на своём месте. Так что эту статью смело можно использовать чтобы немного улучшить код ядра Linux.

  3. Цель статьи — реклама PVS-Studio. Если мы можем найти ошибки в проекте версии X, то мы сможем найти что-то и в версии Y. Наши проверки достаточно поверхностны (мы не знакомы с проектом) и их целью является написание вот таких статей. Настоящую пользу проекту приносит приобретение лицензии на PVS-Studio и его регулярное использование.



4 года назад
#
Специализация шаблона базовым классом

habrahabr.ru

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

Пусть у нас есть несколько базовых классов и классы, которые могут от них наследоваться.
Итак, имеем Base1, Base2, Base3 и классы Deliver12, Deliver23.

class Deliver12: public Base1, public Base2
{};

class Deliver23: public Base2, public Base3
{};

И есть некоторый класс Executor.

templatestruct Executor
{
void operator()(const T&);
};

В этом примере использовать аргумент функции не будем, просто предположим, что метод operator() будет выполнять какие-то действия с переданным объектом…

4 года назад
#
Создание барьера синхронизации с использованием C++11

habrahabr.ru

Введение

Сравнивая две различные технологии параллельного программирования: потоки POSIX и потоки C++11, можно заметить, что в последних отсутствует аналог типа barrier_t из библиотеки pthread.

Довольно странно, что такой важный примитив синхронизации отсутствует в стандартной библиотеке. В этой статье пойдёт речь о том, как сделать барьер с использованием только библиотек, входящих в набор стандарта C++11.

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

4 года назад
#
Грязные трюки с макросами C++

habrahabr.ru

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

  • Безопасный вызов метода

  • Неиспользуемые переменные

  • Превращение в строку

  • Запятая в аргументе макроса

  • Бесконечный цикл


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

4 года назад
#
Параллельное программирование с CUDA. Часть 2: Аппаратное обеспечение GPU и шаблоны параллельной коммуникации

habrahabr.ru

Содержание

Часть 1: Введение.
Часть 2: Аппаратное обеспечение GPU и шаблоны параллельной коммуникации.
Часть 3: Фундаментальные алгоритмы GPU: свертка (reduce), сканирование (scan) и гистограмма (histogram).
Часть 4: Фундаментальные алгоритмы GPU: уплотнение (compact), сегментированное сканирование (segmented scan), сортировка. Практическое применение некоторых алгоритмов.
Часть 5: Оптимизация GPU программ.
Часть 6: Примеры параллелизации последовательных алгоритмов.
Часть 7: Дополнительные темы параллельного программирования, динамический параллелизм.

Шаблоны параллельной коммуникации

Шаблоны параллельной коммуникации

4 года назад
#
Рабочие группы в OpenCL 2.0. Неоднородные рабочие группы

habrahabr.ru

Среди новых возможностей OpenCL 2.0 появилось несколько новых полезных встроенных функций, так называемых функций рабочих групп. Эти встроенные функции предоставляют широко используемые параллельные примитивы, работающие на уровне рабочих групп. В этой статье кратко описываются функции рабочих групп, приводятся данные производительности для устройства OpenCL Intel HD Graphics, а также рассматривается пример использования неоднородных рабочих групп.

Описание функций рабочих групп

Функции рабочих групп включают три классических алгоритма уровня рабочих групп (value broadcast, reduce и scan), а также две встроенные функции, проверяющие логический результат операции, проведенной для всей рабочей группы. Алгоритмы reduce и scan поддерживают операции add, min и max.
Функциональность встроенных функций рабочих групп очевидна из названий.

  • work_group_broadcast() распространяет значение выбранного рабочего элемента на все элементы рабочей группы.

  • work_group_reduce() вычисляет значения sum, min или max для всех элементов рабочей группы, а затем распространяет полученное значение на все элементы рабочей группы.

  • work_group_scan() вычисляет значения sum, min или max для всех предшествующих рабочих элементов (с возможным включением текущих).

  • work_group_all() возвращает логическое И для одинакового логического выражения, вычисленного для каждого рабочего элемента.

  • work_group_any() действует аналогично work_group_all(), но использует логическое ИЛИ.



4 года назад
#
Параллельное программирование с CUDA. Часть 1: Введение

habrahabr.ru

Еще одна статья о CUDA — зачем?

На Хабре было уже немало хороших статей по CUDA — раз, два и другие. Однако, поиск комбинации «CUDA scan» выдал всего 2 статьи никак не связанные с, собственно, алгоритмом scan на GPU — а это один из самых базовых алгоритмов. Поэтому, вдохновившись только что просмотренным курсом на Udacity — Intro to Parallel Programming, я и решился написать более полную серию статей о CUDA. Сразу скажу, что серия будет основываться именно на этом курсе, и если у вас есть время — намного полезнее будет пройти его.

Содержание

На данный момент планируются следующие статьи:
Часть 1: Введение.
Часть 2: Аппаратное обеспечение GPU и шаблоны параллельной коммуникации.
Часть 3: Фундаментальные алгоритмы GPU: свертка (reduce), сканирование (scan) и гистограмма (histogram).
Часть 4: Фундаментальные алгоритмы GPU: уплотнение (compact), сегментированное сканирование (segmented scan), сортировка. Практическое применение некоторых алгоритмов.
Часть 5: Оптимизация GPU программ.
Часть 6: Примеры параллелизации последовательных алгоритмов.
Часть 7: Дополнительные темы параллельного программирования, динамический параллелизм.

Задержка vs пропускная способность

Задержка vs пропускная способность

4 года назад
#
Lock-free структуры данных. Диссекция очереди

habrahabr.ru

Очередь в кассу?

Со времени предыдущего поста из жизни lock-free контейнеров прошло немало времени. Я рассчитывал быстро написать продолжение трактата об очередях, но вышла заминка: о чем писать, я знал, но реализации на C++ этих подходов у меня не было. «Не годится писать о том, что сам не попробовал», — подумал я, и в результате я попытался реализовать в libcds новые алгоритмы очередей.
Сейчас настал момент, когда я могу аргументированно продолжить свой цикл. В данной статье закончим с очередями.

Кратко напомню, на чем я остановился. Были рассмотрены несколько интересных алгоритмов lock-free очередей, а под занавес приведены результаты их работы на некоторых синтетических тестах. Главный вывод — всё плохо! Надежды на то, что lock-free подход на магическом compare-and-swap (CAS) даст нам пусть не линейный, но хотя бы какой-то рост производительности с увеличением числа потоков, не оправдались. Очереди не масштабируются. В чем причина?..

4 года назад
#
Сериализация C++ с полиморфизмом и прототипами

habrahabr.ru

Уже достаточно давно заинтересовался темой сериализации, а если конкретно, то сериализацией объектов, хранящихся по указателю на базовый класс. Например, если мы хотим загружать интерфейс приложения из файла, то скорее всего нам придется заполнять полиморфными объектами контейнер по типу “std::vector<iWidget*>”. Возникает вопрос, как подобное реализовать. Этим я недавно решил заняться и вот что получилось.

Для начала я предположил, что нам все-таки придется унаследовать в базовом классе интерфейс iSerializable, такого вида:

class iSerializable
{
public:
virtual void serialize (Node node) = 0;
};

И конечный класс должен выглядеть примерно так:

class ConcreteClass: public iSerializable
{
public:
virtual void serialize (Node node) override
{
node.set_name (L«BaseClass»);
node.serialize (m_int, L«int»);
node.serialize (m_uint, L«uint»);
}
private:
int m_int = 10;
unsigned int m_uint = 200;
};


4 года назад
#
Сводная таблица по поддержке C++ 11/14/17

habrahabr.ru

Как любому C++ разработчику, следящему за новинками в отрасли и стандартами в частности, мне стало интересно, насколько полно вообще поддерживается стандарт C++ 11 (а также 1y и 1z) разными компиляторами? Да, существуют разные сводные таблицы, но чаще всего это сравнение двух компиляторов или двух версий одного компилятора, либо сводная таблица, но уже устаревшая, либо вообще неполный список. В общем, сел я да и сделал полную таблицу (на основе списка Clang-a и GCC) по четырем компиляторам: Clang, GNU C++, MSVC и Intel C++.
Внимание! Данная таблица прежде всего предназначена для тех, кто пишет свой продукт. Если Вы разрабатываете библиотеку, то, естественно, лучше ознакомиться с особенностями поддержки в первоисточнике (а еще лучше на все тесты написать). Для меня она прежде всего нужда для решений вроде «О! Range-for можно уже использовать без проблем.»…

4 года назад
#
Сериализация и С++11

habrahabr.ru

Сериализация в C++
Уверен, что многим кто работает с С++ хотелось, чтобы в этом, дивном языке, была возможность сериализовать объекты так же просто, как скажем в С#. Вот и мне этого захотелось. И я подумал, а почему бы и нет, с помощью нового стандарта это должно быть несложно. Для начала стоит определиться с тем, как это должно выглядеть.
class Test: public Serializable
{
public:
int SomeInt = 666;
float SomeFloat = 42.2;
string SomeString = «Hello My Little Pony»;
private:
serialize(SomeInt);
serialize(SomeFloat);
serialize(SomeString);
};

Такое мне вполне подходило, и я уже представлял себе решение.

У нас же есть C++11, а это в свою очередь означало, что у нас в распоряжении имеются лямбды и инициализация полей в объявлении класса. Соответственно можно писать подобные штуки.
struct Test
{
string SomeString = «Hello My Little Pony»;
function<void()> SomeFunc = [this]()
{
cout << SomeString;
};
};

4 года назад
#
Атомарные и неатомарные операции

habrahabr.ru

Shared Memory

В Сети уже очень много написано об атомарных операциях, но в основном авторы рассматривают операции чтения-модификации-записи. Однако, существуют и другие атомарные операции, например, атомарные операции загрузки (load) и сохранения (store), которые не менее важны. В этой статье я сравню атомарные загрузки и сохранения с их неатомарными аналогами на уровне процессора и компилятора C/C++. По ходу статьи мы также разберемся с концепцией «состояния гонок» с точки зрения стандарта C++11.

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

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

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

4 года назад
#
Новые оптимизации для х86 в ожидаемом GCC 5.0

habrahabr.ru

Итак, фактическую разработку новых оптимизаций в GCC 5.0 можно считать законченной. Продукт GCC 5.0 находится сейчас в фазе stage3, то есть идет доработка уже внедренных оптимизаций. В данной и последующих статьях я расскажу об оптимизациях, реализованных в GCC 5.0 для х86 и об их влиянии на производительность программ для процессоров линейки Intel Atom и Intel Core. Сегодня речь пойдет о векторизации групповых обращений в память. В последующих статьях я расскажу об ускорениях в 32-битном PIC режиме и дополнительном усилении векторизации.

Как вы уже, наверное, догадались, в GCC 5.0 существенно улучшена векторизация групповых обращений в память. Под групповым обращением в память понимается итерируемая последовательность обращений. Например:

x = a[i], y = a[i + 1], z = a[i + 2]

итерируемое по i — это группа загрузок из памяти длиной 3. Длина группы обращений в память — это расстояние между самым младшим и старшим адресами в группе. Для примера выше — это (i + 2) – (i) + 1 = 3
Количество обращений в память в группе не превосходит ее длину. Например:

x = a[i], z = a[i + 2]

итерируемое по i — это группа длиной 3, несмотря на то, что обращений в память всего 2.

GCC 4.9 векторизует группы, где длина — это степень 2 (2, 4, 8 …).

GCC 5.0 векторизует группы, где длина равна 3 или степени 2 (2, 4, 8 …). Другие длины не векторизуются, так как встречаются в реальных приложениях очень редко.

Чаще всего векторизация группы обращений в память применяется при работе с массивами структур.

1. Конвертация изображений, скажем, в структуре RGB. Пример.
2. Работа с N-мерными координатами (скажем, чтобы нормализовать трехмерные точки). Пример.
3. Умножение векторов на константную матрицу:

a[i][0] = 7 * b[i][0] — 3 * b[i][1];
a[i][1] = 2 * b[i][0] + b[i][1];

В целом в GCC 5.0 (по сравнению с 4.9)

  • Появилась векторизация группы обращений в память длиной 3

  • Существенно улучшилась векторизации группы загрузок из памяти для любой длины

  • Стали использоваться техники векторизации групп обращений в память оптимальные для конкретного x86 процессора.



13 14 16

Авторизация

Войдите, используя Ваш аккаунт

Войти с помощью

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

КАРКАМ

Нетология