Обновить
256K+

C++ *

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

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

Секретный конструктор std::shared_ptr

Время на прочтение4 мин
Охват и читатели49K
This constructor is so secret, not even STL maintainers know about it...
Stephan T. Lavavej
Этот конструктор настолько секретный, что даже сопровождающие STL не знают о нём...
пер.: Door

У std::shared_ptr есть небольшой секрет: очень полезный конструктор, о котором большинство программистов даже не слышали. Он был добавлен только в стандарте С++11, и его не было даже в TR1 версии shared_ptr. Однако он поддерживается gcc с версии 4.3, и компилятором MSVC еще с времен Visual Studio 2010. В Boost он появился примерно с 1.35.0.

В большинстве обучающих материалов, в которых описывается std::shared_ptr ничего нет об этом конструкторе. Скотт Майерс ни словом не обмолвился о нем в «Effective Modern C++», другой автор — Nicolai Josuttis уделил этому конструктору около половины страницы в своей книге «The C++ Standard Library».



Итак, что представляет собой этот секретный конструктор?
Читать дальше →

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

Время на прочтение20 мин
Охват и читатели6.9K
Apple II emulator for Windows
Одной из основных сложностей при использовании инструментов статического анализа является работа с ложными срабатываниями. Существует множество способов устранить ложные срабатывания, используя настройки анализатора или изменяя код. Я взял маленький проект Apple II emulator for Windows и покажу, как можно на практике работать с отчётом статического анализатора PVS-Studio. Покажу на примерах, как править ошибки и подавлять ложные срабатывания.
Читать дальше →

Новое предупреждение о неверном вычислении размера массива в gcc 5.1

Время на прочтение2 мин
Охват и читатели16K
Хорошие новости для пользователей gcc — при использовании gcc 5.1 и выше им будет проще быстро находить вот такую распространенную ошибку вычисления размера массива, объявленного как параметр функции:

void something( char arr[100] )
{
    // this loop is broken
    for( size_t index = 0; index < sizeof(arr)/sizeof(arr[0]); index++ ) {
       //WHATEVER
   }
}

Хотя параметр и объявлен как массив известного размера, с точки зрения компиляторов C и C++ это указатель типа char*, поэтому sizeof(arr) даст то же значение, что и sizeof(char*) – скорее всего, 4 или 8. Цикл, скорее всего, будет работать не так, как ожидалось.
Другой вариант:
void something( char encryptionKey[9000] )
{
   // WHATEVER, PROFIT

  // this call is broken
  SecureZeroMemory( encryptionKey, sizeof(encryptionKey)); // erase the key
}

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

Чтобы найти такой код было проще, в gcc 5.1 и новее на такой код выдается предупреждение и оно включено по умолчанию.
Читать дальше →

Удобная сериализация данных с Variadic Templates

Время на прочтение9 мин
Охват и читатели10K

Предисловие


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

Поддерживаются следующие типы данных:
— Все фундаментальные типы С++
— std::string
— std::vector где T — все что угодно из этого же списка
— Любой перечислимый тип
Читать дальше →

Криптовалюта — как её создавать?

Время на прочтение7 мин
Охват и читатели165K
Я уверен, все знают, что такое криптовалюта, и возможно вы даже знаете, с чем её едят, и сами пользовались. В 2009 году благодаря Satoshi Nakamoto была создана всем известная Bitcoin, благодаря которой её автор заработал приличное состояние.



Конечно, сразу же после появления успешной инновации на рынке появляются другие похожие продукты. Так и произошло, тут же как грибы начали появляться новые криптовалюты, какие-то просто копировали идею Bitcoin и были бесполезной альтернативой (с технической точки зрения), какие-то привносили что-то своё. Но как ни странно, ажиотаж криптовалюты не стих. До сих пор в сети Интернет появляются всё новые и новые ресурсы, которые предлагают купить/пользоваться их валютой.

И следует логичный вопрос: если первая криптовалюта появилась в 2008 году, то ведь давно уже в сети Интернет должны существовать ресурсы с гайдами, уроками и примерами создания таких вещей.

Действительно, такое есть, но, к сожалению, все уроки сводятся к: “Придумай, купи на сайте, внедри” или “Придумай, скачай, пользуйся с друзьями” и так далее. И никогда не рассматривается подробный процесс создания. В общем-то, данной статьёй я и хотел бы исправить настоящее положение вещей и всё-таки привнести в русскоговорящее комьюнити такую информацию и рассказать людям, как же всё-таки можно создать свою валюту.
Читать дальше →

Добавление поддержки двунаправленного текста в собственный TextBox

Время на прочтение5 мин
Охват и читатели9.4K

Введение


Давно хотел поделиться опытом добавления поддержки двунаправленного текста в собственный редактор текста, но подвигли меня к этому корыстные соображения. В этой статье я напишу как интегрировал GNU FriBidi в свой TextBox для поддержки арабского языка. Надеюсь, моя статья окажется полезной, так как хороших материалов по поддержке арабского текста сложно найти.

Что мы имели


К моменту возникновения необходимости добавления поддержки арабского языка, самописный контрол TextBox уже умел многое: редактировать текст, управлять курсором, выделять часть текста, вставлять, вырезать, поддерживать много строк, выравнивание и т.д. Конечно, с Word не сравнится, но базовые вещи он умел. Также TextBox использовался в приложении для Windows и Mac OS X.

Привет Хабру
Читать дальше →

Конференция C++ Siberia в Новосибирске

Время на прочтение2 мин
Охват и читатели5K
Всем привет!

28-29 августа сообщество при поддержке компаний Яндекс, 2ГИС и PVS-Studio проводит в Новосибирске конференцию, полностью посвященную C++. Открывать конференцию будет Eric Niebler. Выступать будут как докладчики с наших предыдущих встреч, так и новые лица. Спектр тем варьируется от обсуждения неожиданных инструментов для сборки крупных проектов до функциональных приемов в современном C++. Как всегда немного обсудим Qt, чуть-чуть поговорим о математике и затронем вопросы стандарта. Заявки на доклады всё ещё принимаются. Также, планируем посвятить один трек блиц-докладам. Так что если хотите что-то обсудить, сможете записаться в первый день, а на второй представить краткий доклад о проблеме, обсудим все вместе.

Коротко о главном


Что: конференция, целиком посвящённая C++.
Где: Новосибирск, ул. Станционная, 104, Экспо-Центр
Когда: 28-29 августа 2015
Цена билета: от 4000 до 6500 (чем раньше покупаешь, тем дешевле).
Сайт: meetingcpp.ru
Подробности под катом

Брокер сообщений для сервисной архитектуры на базе ZMQ — или отдых разработчика

Время на прочтение6 мин
Охват и читатели30K


Сильный ветер дул в борт судна. Мелкие брызги и капли дождя заставляли щурится слегка небритое лицо под очками. Было не просто холодно: холод проникал всюду. Под куртку, штаны. От него немели руки и застывала кровь. Но моряк знал, что где-то там за мысом есть тихий остров, на котором можно переждать непогоду.
Берег встретил измученный экипаж шумом деревьев и шепотом камышей. Люди знали, что у них есть лишь сутки, чтобы отдохнуть, помыться и продолжить борьбу со стихией.

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

Удобный лог не роскошь, а средство отладки, или как подключить dll при помощи h файла

Время на прочтение6 мин
Охват и читатели7.8K
image

ПроЛог


Не один программист, приступая к разработке приложения, не проходит мимо вопроса о логах. Вроде бы простой вопрос, но перебирая уже существующие варианты, понимаешь, что в каждом что-то неудобно: нет run-time отключения лога (только при компиляции), иногда нужно перенаправить лог в файл, иногда в communication port или еще куда-нибудь и т.д. и т.п. Писать полноценный вариант не хватает времени, а создавать наспех еще одну реализацию — рука не поднимается. И получается, как говорится, сапожник без сапог, даже еще хуже, ведь логи это инструмент разработки… А что если подойти к этому вопросу не спеша? Как разработчику мне бы хотелось видеть инструмент отладки таким:

  1. Легким и простым в использовании — чтобы можно было по умолчанию включить один h файл в проект и все заработало будь то старое или новое приложение.
  2. Расширяемым — чтобы добавив один h файл в проект, можно было нарастить функциональность настолько, насколько вам необходимо, не затрагивая при этом самого приложения (ведь часто приложение уже работает у клиента и трогать его не желательно).
  3. Конфигурируемым в полном объеме — разработчик в отличии от пользователя должен контролировать инструмент разработки в полной мере.

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

Возможности С++ 11/14/17 в Visual Studio 2015 RTM

Время на прочтение5 мин
Охват и читатели27K
Близится дата релиза Visual Studio 2015, и многие хотели бы узнать, как обстоят дела с поддержкой стандартов C++ в компиляторе Microsoft.
Читать дальше →

Умножение Карацубы и C++ 11

Время на прочтение6 мин
Охват и читатели50K
Хочу в очередной раз затронуть метод реализации умножения Карацубы с использованием возможностей стандарта C++11. Данный алгоритм неоднократно рассматривался здесь («Умножение длинных чисел методом Карацубы», «Алгоритм Карацубы для умножения двух чисел»), но видимо из-за того, что я не умею их готовить, первый вариант не работал с числами разной длины, а второй делает не совсем то, что было нужно.

Для тех, кто не устал от этой заезженной темы, а также всех, кто испытывает трудности с реализацией этого простого, но очень эффективного алгоритма, прошу читать дальше.
Читать дальше →

Такие удивительные семафоры

Время на прочтение9 мин
Охват и читатели153K
От переводчика: Джефф Прешинг (Jeff Preshing) — канадский разработчик программного обеспечения, последние 12 лет работающий в Ubisoft Montreal. Он приложил руку к созданию таких известных франшиз как Rainbow Six, Child of Light и Assassin’s Creed. У себя в блоге он часто пишет об интересных аспектах параллельного программирования, особенно применительно к Game Dev. Сегодня я бы хотел представить на суд общественности перевод одной из статей Джеффа.

Поток должен ждать. Ждать до тех пор, пока не удастся получить эксклюзивный доступ к ресурсу или пока не появятся задачи для исполнения. Один из механизмов ожидания, при котором поток не ставится на исполнение планировщиком ядра ОС, реализуется при помощи семафора.

Раньше я думал, что семафоры давно устарели. В 1960‑х, когда еще мало кто писал многопоточные программы, или любые другие программы, Эдсгер Дейкстра предложил идею нового механизма синхронизации — семафор. Я знал, что при помощи семафоров можно вести учет числа доступных ресурсов или создать неуклюжий аналог мьютекса, но этим, как я считал, область их применения ограничивается.
Читать дальше →

Использование LevelDB

Время на прочтение8 мин
Охват и читатели47K
Столкнулся с ситуацией, когда мои коллеги для организации локального персистентного key-value хранилища используют SQLite, MemcacheDB, Redis игнорируя встраиваемые хранилища такие как LevelDB, Sophia, HamsterDB и т.д.

Я разбил статью на две части:
  1. небольшое введение в api LevelDB;
  2. использование LevelDB, для хранения временных рядов.

Подробности

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

Выбор между C++ и C#

Время на прочтение8 мин
Охват и читатели312K
Попробую поднять спорную, но, думаю, интересную тему. Для начала представлюсь. По роду деятельности я специализируюсь на разработке десктопных приложений под Windows, поэтому по большей части с этой позиции и буду выполнять сравнение.

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

Отдельных статей требует рассмотрение выбора Java или же интерпретируемых языков. Они будут предпочтительнее, чем С++ или С# в некоторых случаях, однако вынесем такие случаи за рамки данной статьи и сфокусируемся на сравнении С++ и С#.

Для ясности обозначу, что под C++ буду понимать unmanaged код, а под C# — managed код. В статье можно было сравнить managed и unmanaged, но это было бы менее полезно практический. А mixed код, хотя он и представляет некоторый интерес, оставим по большей части за рамками данной статьи.

Прошу извинить за некоторую категоричность высказываний, однако, думаю, она требуется для более точного донесения мыслей. Сравнивать буду по критериям, давая по каждому некоторое заключение основанное на личной практике, фундаментальных основах и известному опыту использования. Итак, начнем.
Читать дальше →

Модернизация IDA Pro. Debugger-плагин. Часть I. Теория

Время на прочтение4 мин
Охват и читатели30K

Всем привет. Я решил попробовать начать цикл статей по модернизации нашей с вами любимой IDA Pro.
В каждом из туториалов я попытаюсь раскрыть довольно таки сложную и мало изученную тему: написание различных модулей:
  • загрузчики;
  • плагины;
  • дебагер-плагины;
  • процессорные модули;
  • скрипты.

И, если процессорные модули, плагины и скрипты — тема все таки более менее раскрытая, то все остальное — практически полный мрак (в конце статьи я дам список литературы и проектов, где есть хоть что-то).

Итак, первая статья из цикла будет посвящена написанию плагина-отладчика, а точнее предварительной теории. В штатной поставке IDA SDK уже имеются исходники основных дебагеров (Windows, Linux, Mac). Но как быть, например, с Amiga, M68000?
Читать дальше →

Статический анализ библиотеки HPX при помощи PVS-Studio

Время на прочтение5 мин
Охват и читатели5.2K
Данная статья является переводом блогпоста Хартмута Кайзера об опыте использования PVS-Studio над HPX — C++ библиотекой для распределенных/параллельных вычислений любого масштаба.

Однажды мы уже использовали trial-версию анализатора PVS-Studio для HPX, и тогда он запомнился нам своей многословностью. В последнее время появилось множество статей об этой утилите, и, т.к. прошло немало времени с момента ее использования, мы решили связаться с разработчиками с целью узнать, готовы ли они поддержать наш open-source продукт. Мы очень обрадовались, когда получили лицензию на 1 год в обмен на статью о найденных проблемах.
Читать дальше →

Простая замена Boost::Optional для использования nullable-типов в проектах C++

Время на прочтение3 мин
Охват и читатели7.7K
Статья рассказывает историю о том, как автора напугал монструозный Boost и как он придумал свой маленький nullable-велосипед. Возможно, статья будет полезна тем, кто хочет использовать простые nullable-типы в своём проекте без использования Boost, отвечающие приведённым в статье не самым простым требованиям.
Читать дальше →

Автоматическая реорганизация массивов в памяти графического ускорителя

Время на прочтение14 мин
Охват и читатели7.4K

О чем речь


В данном посте я бы хотел описать часть системы времени выполнения (RTS — RunTime System в дальнейшем) компилятора DVMH. Рассматриваемая часть, как видно из заголовка, относится к обработке пользовательских массивов на GPU, а именно, их автоматическая трансформация или реорганизация в памяти ускорителя. Данные преобразования делаются для эффективного доступа к памяти GPU в вычислительных циклах. Что такое DVMH, как можно подстраиваться под вычисления и почему это делается автоматически — описано далее.
О системе DVM и чудо преобразованиях

Qt Framework: потоки, иерархический конечный автомат, работа с USB-устройствами = QThread + QStateMaсhine + libUSB

Время на прочтение68 мин
Охват и читатели28K
Почти все разработчики программного обеспечения рано или поздно подходят к этапу, когда необходимо применить технологию распределения задач по отдельным потокам. Сейчас трудно представить разработку без применения того или иного фреймворка (framework).
Множество из них содержат необходимые инструменты для создания многопоточных приложений. Не исключение и Qt Framework.

Поговорим о методах Qt многопоточной разработки подробнее.

Сообщество разработчиков ПО на Qt Framework огромно. Люди охотно делятся навыками и приёмами создания многопоточных приложений. Существует множество замечательных книг и статей по вопросам изящного и не очень решения задачи работы с несколькими потоками.
Казалось бы, всё уже решено. Что ещё можно добавить?
Попробую описать работу потока на основе функционирования конечного автомата. Признаюсь, не находил материалы с подобным решением в сети.
Если статья поможет вам с идеей, что, по моему мнению, гораздо ценнее написанного кода, буду очень рад.

Выражаю отдельную благодарность А. Н. Боровскому за книгу «Qt4.7+.Практическое программирование на C++».
Рекомендую к обязательному прочтению!
Читать дальше →

Выпуск фреймворка Qt 5.5

Время на прочтение2 мин
Охват и читатели30K
Вчера, после шести месяцев разработки, вышла версия 5.5 кроссплатформенного фреймворка Qt.

Qt позволяет разрабатывать приложения при помощи C++ и декларативного языка программирования QML, поддерживает все основные десктопные и мобильные платформы, а также некоторые встраиваемые и имеет открытый исходный код. Существует коммерческая версия Qt, содержащая дополнительные проприетарные модули.

По сравнению с предыдущей версией, в 5.5 было внесено около 1500 исправлений и добавлен новый функционал. За подробностями прошу под кат.


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