Как стать автором
Поиск
Написать публикацию
Обновить
121.34

C++ *

Типизированный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

SFINAE — это просто

Время на прочтение7 мин
Количество просмотров105K
TLDR: как определять, есть ли в типе метод с данным именем и сигнатурой, а также узнавать другие свойства типов, не сойдя при этом с ума.
image

Здравствуйте, коллеги.
Хочу рассказать о SFINAE, интересном и очень полезном (к сожалению*) механизме языка C++, который, однако, может представляться неподготовленному человеку весьма мозгоразрывающим. В действительности принцип его использования достаточно прост и ясен, будучи сформулирован в виде нескольких чётких положений. Эта заметка рассчитана на читателей, обладающих базовыми знаниями о шаблонах в C++ и знакомых, хотя бы шапочно, с C++11.
* Почему к сожалению? Хотя использование SFINAE — интересный и красивый приём, переросший в широко используемую идиому языка, гораздо лучше было бы иметь средства, явно описывающие работу с типами.
Читать дальше →

Cocos2d-x: несколько рекомендаций, как не допустить утечек памяти

Время на прочтение4 мин
Количество просмотров14K
Cocos2d-x — это «движок», а точнее — набор классов, который сильно упрощает разработку графических приложений для операционных систем таких как iOS, Android, Windows phone, Windows, а также для HTML 5. В отличии от сocos2d-iphone, cocos2d-x предполагает разработку на C++, поэтому он такой универсальный. Те, кто пишет на C++ знают, что вся ответственность за выделение и освобождение памяти лежит на плечах программиста. Но разработчики cocos2d-x не плохо позаботились об этом и встроили в свой замечательный движок пул объектов, который предполагает использование смарт-поинтеров или, другими словами, умных указателей.
Читать дальше →

Классы типов на C++

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

Уже было описано как реализовать монады на C++ без классов типов. Я же хочу показать, как можно реализовать классы типов, использую в качестве примера монады.
Этот прием широко применяется в языке Scala, но может быть использован и в C++. Кратко я его описал в качестве иллюстрации трудностей унифицированного описания библиотек, сейчас же продемонстрирую его реализацию.
Нужно отметить что классы типов применяются не только в декларативных языках, как Haskell и Mercurry, но о нашли свое отражение в достаточно классических Go и Rust.
Этот прием так же подходит для реализации мультиметодов из Common Lisp и Clojure.

C++ я не брал в руки уже лет шесть, так что код может быть не идеоматичным и не использовать новые (полезные) фичи.
Кроме того, я полностью игнорирую проблему управления памятью — практикующие C++ справятся с этим лучше меня.
Работоспособность кода проверялась на gcc 4.7.3.

Сеанс черной магии с полным разоблачением

Объектный пул и быстрое создание объектов в куче

Время на прочтение5 мин
Количество просмотров18K
Хочу поделится очередным велосипедом собственной сборки на С++. Велосипед умеет быстро создавать и выдавать объекты. В результате получаем скорость создания (не отдачи) объектов на 30% быстрее чем просто с new. Объектный пул — вещь не новая, и в общем — чего о нем и говорить то. Но как говорится — главное в деталях.
Детали

Вы все еще кипятите и сравниваете this с нулем?

Время на прочтение4 мин
Количество просмотров34K
Давным-давно в далекой-далекой галактике широко использовалась библиотека MFC, в которой у ряда классов были методы, сравнивающие this с нулем. Примерно так:

class CWindow {
    HWND handle;
    HWND GetSafeHandle() const
    {
         return this == 0 ? 0 : handle;
    }
};

«Это же не имеет смысла» – возразит читатель. Еще как «имеет»: этот код «позволяет» вызывать метод GetSafeHandle() через нулевой указатель CWindow*. Такой прием время от времени используется в разных проектах. Рассмотрим, почему на самом деле это плохая идея.
Читать дальше →

TIZEN Developer Summit & Hakathon 2013: взгляд из Нью-Йорка, Сеула и Владивостока

Время на прочтение10 мин
Количество просмотров3.8K
Поводом для написания этой статьи послужила поездка на конференцию по TIZEN, проходившая в Сеуле в середине ноября. Разработка приложений под TIZEN входит в мои непосредственные профессиональные обязанности, поэтому решение посетить это мероприятие было быстрым и решительным. Я живу и работаю во Владивостоке, тут недалеко, 2 часа полета с испытанием огненной корейской кухней – и я в Сеуле. Непосредственно про TIZEN на хабре уже писали как минимум здесь, здесь, а непосредственно про разработку еще и здесь, поэтому в этой статье я опишу само мероприятие в стиле «испытано на себе». Статья предполагается как вводная в серии, процесс описан «с нуля». Учитывая во многом печальный опыт неофитов Тай’Дзэн, когда много нервов и времени тратится на войну с IDE, достаточное внимание будет уделено вопросам установки и настройки оной. Всех заинтересовавшихся прошу под кат.
Читать дальше →

Оптимизация обработки изображений на C++ с использованием SIMD. Медианный фильтр

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

Введение


Ранее во вступительной статье я поднимал список проблем, с которыми придется столкнуться разработчику, если он захочет оптимизировать оптимизацию обработки изображения при помощи SIMD инструкций. Теперь пришло время на конкретном примере показать, как указанные выше проблемы можно решить. Я долго думал, какой алгоритм выбрать для первого примера, и решил остановиться на медианной фильтрации. Медианная фильтрация является эффективным способом подавления шумов, которые неизбежно появляются на цифровых камерах в условиях малого освещения сцены. Алгоритм этот достаточно ресурсоемок – так например, при обработке серого изображения медианным фильтром 3х3 требуется порядка 50 операций на одну точку изображения. Но в тоже время он оперирует только с 8-битными числами и ему для работы требуется сравнительно не много входных данных. Эти обстоятельства делают алгоритм достаточно простым для SIMD оптимизации и в тоже время позволяют получить из нее весьма существенное ускорение.

image
Читать дальше →

Элемент управления Grid… продолжение 1

Время на прочтение7 мин
Количество просмотров6.6K
В первом посте мы разбили функциональность грида на несколько классов. Давайте еще раз быстренько их опишем:
  • Lines — представляет набор колонок или строк.
  • Range — oписывает любую совокупность ячеек.
  • Layout — позволяет размещать данные внутри ячейки.
  • Model — определяет интерфейс доступа к данным для View и Controller.
  • View — показывает информацию в ячейке.
  • Controller — позволяет пользователю менять данные.
  • CacheCell — кеширует данные для видимой ячейки.
  • CacheGrid — кеширует данные для видимой части грида.
  • GridWindow — специальный контрол.

Так же мы описали модели и вью для текстовых данных (ModelText, ModelTextCallback. ViewText). Давайте попробуем создать грид и привязать к нему текстовые данные. Новую функциональность, которая нужна для работы стандартного грида будем добавлять в виде специальных Model/View/Controller.
Читать дальше →

Как мы пытаемся продать PVS-Studio в Google или очередные ошибки в Chromium

Время на прочтение14 мин
Количество просмотров53K
PVS-Studio интегрируется в Ninja для проверки Chomium.


Когда мы пишем статьи про проверки каких-либо проектов с помощью PVS-Studio, то, как правило, у нас прибавляется клиентов. Тут все честно. Программисты не любят рекламу, но охотно отзываются на интересные материалы, которые легко проверить. Поэтому мы не рекламируем свой инструмент, а просто показываем, что он умеет. Однако, хотя мы проверили код Chromium уже три раза и трижды находили в нем ошибки, ордера с почтой в google.com в моей почте до сих пор нет. Поскольку мне интересно, что я делаю не так, и почему Google пока не использует PVS-Studio, я решил написать очередную статью.

Эта статья состоит из двух частей. В первой рассказывается об инфраструктуре проекта Chromium и нюансах интеграции, во второй приведены очередные найденные ошибки.

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

Хотите узнать, почему разрабатывать Chromium сложно и далеко не каждый инструмент для программистов может быть использован в проекте Chromium? Тогда читаем…

Читать дальше →

Стоит ли оптимизировать обработку изображений на С++ при помощи SIMD?

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

SIMD и обработка изображений


Обработка изображений (здесь мы сознательно ограничиваем в себя только растровыми картинками и опускаем широкий класс векторных изображений), как правило, представляет собой набор простых операций, которые применяются к каждой точке изображения. Если учесть, что цветовые каналы, из которых состоит точка изображения (пиксель) обычно представлены в виде целых чисел небольшой размерности, то обработка изображения сводится к огромному числу однотипных операций над 1-2 байтными целыми числами.
image
Читать дальше →

Внутреннее устройство llst, часть 2 или Little Smalltalk + LLVM = ♥

Время на прочтение29 мин
Количество просмотров9.7K
Всем привет! Совместно с humbug, мы предлагаем вашему вниманию третью статью из цикла о Low Level Smalltalk (LLST). Надемся, что статья будет интересна не только любителям велосипедов необычных языков программирования, но и тем, кто интересуется такой замечательной вещью, как LLVM.

Напомню, что целью нашего проекта является создание собственной виртуальной машины, совместимой с Little Smalltalk на уровне байт-кодов. Ключевым отличием является гетерогенная архитектура, которая позволяет исполнять байт-коды как программно, так и компилировать их в низкоуровневые инструкции процессора посредством трансляции в IR код LLVM. Разумеется, второй способ позволяет достичь более высокой производительности и задействовать имеющиеся в нашем распоряжении вычислительные ресурсы оптимальным образом.

Однако, обо всем по порядку…
Читать дальше →

Элемент управления Grid

Время на прочтение10 мин
Количество просмотров18K
Табличные элементы управления (обычно в их названии присутствуют слова Table или Grid) широко используются при разработке GUI. Так получилось, что на работе мы используем С++ и MFC для разработки пользовательского интерфейса. В начале мы использовали CGridCtrl — общедоступную и довольно известную реализацию грида. Но с некоторого времени он перестал нас устраивать и появилась на свет собственная разработка. Идеями, лежащими в основе нашей реализации, я хочу с вами здесь поделиться. Есть задумка сделать open source проект (скорее всего под Qt). Поэтому данную заметку можно рассматривать как «Proof Of Concept». Конструктивная критика и замечания приветствуются.

Подробности

Настройка WebRTC + Eclipse 4.3 + ubuntu 13.10

Время на прочтение4 мин
Количество просмотров8.6K
Добрый день, хабрапользователи!

Выкладываю небольшую шпаргалку по настройке WebRTC + Eclipce 4.3 + ubuntu 13.10. Это может быть полезно тем, кто решил попробовать себя в написании кода на С++ для webrtc.
Читать дальше →

Ближайшие события

Resumable функции

Время на прочтение11 мин
Количество просмотров26K
На прошлой неделе в мире С++ произошло интересное событие. Компания Microsoft объявила о выходе обновления к компилятору С++ в Visual Studio 2013. Само по себе обновление компилятора отдельно от Visual Studio или её сервис-пака — уже нетривиальное для Microsoft событие. Но ещё интереснее то, что вошло в это обновление. Полный список можно почитать по ссылке выше, а я остановлюсь только на одном моменте — resumable функции. Для полного понимания ситуации: Microsoft изрядно протроллила и комитет по стандартизации С++ и разработчиков gcc\clang, выпустив (тут надо внимательно) реализацию экспериментальной и не утверждённой ещё возможности будущего стандарта C++17, основанной на экспериментальных и не утверждённых ещё возможностях будущего стандарта C++14, которые в свою очередь являются исправлениями не сильно ещё вошедших в повседневное программирование возможностей С++11.

Достаточно гиковский ход, не находите?

А ниже будет перевод статьи с meetingcpp.com, рассказывающей о том, что это за фича и как её использовать.
Читать дальше →

Meeting C++ 2013

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

Meeting C++, Dusseldorf


Так вышло, что у меня получилось принять участие в работе конференции, посвящённой C++. Уровень, конечно, не GoingNative: доклады были разного уровня. Как очень сильные и интересные, так и совсем пустые. Самым главным для меня была атмосфера — давно я ни с кем лично не обсуждал столько интересных тем. Это мне так понравилась, что я загорелся идеей создать в Санкт-Петербурге C++ User Group, чтобы больше общаться лично с коллегами по цеху. Но об этом как-нибудь потом, а пока о конференции. Не буду описывать и пересказывать все доклады, отмечу только наиболее интересные мне темы и темы, которые затрагивались почти в каждом докладе.
Читать дальше →

Qt: шаблон для корректной работы с потоками — более качественная реализация

Время на прочтение7 мин
Количество просмотров34K
В своей предыдущей статье я затронул тему грамотной реализации потоков в Qt и предложил свой вариант. В комментариях мне подсказали более верное направление. Попробовал сделать — получилось и вправду легко и красиво! Я хотел было исправить старую статью, но Хабр повис — и все потерялось. В итоге я решил написать новую версию.
Смотрим новую версию!

Поиск RSS новостных сайтов

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

Покопался я ещё в своих старых и не очень проектах и нашёл одну интересную программку. Она ищет RSS ссылки новостных сайтов. Задача которая стояла — это найти как можно больше новостных RSS лент и собрать их всех в одну базу.

Когда встал вопрос о том как искать новостные сайты, пришла мысль о использовании сервиса news.google.com. От туда можно выдёргивать ссылки на новостные сайты, к тому же они постоянно добавляются и отсортированы по регионам, темам и т.д. Осталось пройтись по всем разделам news.google.com, выдернуть ссылки новостных сайтов, а затем найти все RSS каждого из них.
Читать дальше →

Введение в Android NDK

Время на прочтение9 мин
Количество просмотров243K
Для разработки приложений под ОС Android, Google предоставляет два пакета разработки: SDK и NDK. Про SDK существует много статей, книжек, а так же хорошие guidelines от Google. Но про NDK даже сам Google мало что пишет. А из стоящих книг я бы выделил только одну, Cinar O. — Pro Android C++ with the NDK – 2012.

Эта статья ориентирована на тех, кто ещё не знаком (или мало знаком) с Android NDK и хотел бы укрепить свои знания. Внимание я уделю JNI, так как мне кажется начинать нужно именно с этого интерфейса. Так же, в конце рассмотрим небольшой пример с двумя функциями записи и чтения файла. Кто не любит много текста, тот может посмотреть видео версию.
Читать дальше →

Получение списка контактов с gmail.com без использования Google API

Время на прочтение8 мин
Количество просмотров4.1K
Однажды мне дали задание получить список контактов пользователя для некоторых почтовых сервисов (среди которых gmail.com, yahoo.com, aos.com). Сначала я занялся изучением почтовых протоколов IMAP и POP3, но к сожалению эти протоколы не предусматривают возможности получения списка контактов. От использования API которые предоставляют некоторые из этих почтовых сервисов я отказался, так-как эти API не для всех языков предоставляются, а так-же пришлось бы тратить время на изучение каждого из них.

Решил я что использование сокетов — это единственный вариант, который позволит быстро получить список контактов и делать это примерно одинаково для большинства почтовых сервисов. Суть в том, чтобы эмулировать работу браузера. Я рассмотрю алгоритм получения списка контактов с gmail.com, но подобным образом это делается и в других почтовых сервисах.
Читать дальше →

Добавление широкоформатных разрешений в Grand Theft Auto

Время на прочтение5 мин
Количество просмотров40K
image
Глядя на серию постов о тридцати строчном javascript программировании, тоже захотелось что-нибудь написать, правда не в 30 строк, но потратив минимум времени, just for fun. Был скачан установщик классической Grand Theft Auto для Windows, а т.к. эта GTA работает только в стандартных разрешениях с соотношением сторон 4:3, я решил написать плагин, который бы запускал её в родном разрешении моего монитора(1920x1080).
Читать дальше

Вклад авторов