Обновить
319.21

C++ *

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

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

Онлайн-компиляция на статическом сайте, рецепт для начинающих

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

Вы несколько лет писали свой проект и теперь хотите привлечь пользователей? У меня есть простой, как холостяцкая яичница с беконом, рецепт специально для вас.

Для приготовления простого сайта вам понадобится:
  • репозиторий на GitHub — 1 штука
  • готовый html шаблон, для придания приятного вида — 1 штука
  • кусочек свежего компилирущегося C++ кода — минимум 1 строка кода
  • готовые javascript соусы из магазина — ~500Kb
  • картинки и анимашки по вкусу

Меняйте любые компоненты, экспериментируйте и готовьте свои сайты для любимого языка!
Приступить

30 лет С++

Время на прочтение7 мин
Охват и читатели34K
14 октября этого года состоялась одна из важнейших годовщин мира программирования – 30-летие языка C++. За это время он завоевал огромную популярность и до сих пор остаётся одним из самых востребованных и широко используемых языков программирования в мире.

В связи с этим юбилеем мы предлагаем вашему вниманию перевод интервью с основателем языка Бьёрном Страуструпом.


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

Управление памятью: Взгляд изнутри

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

Доброго времени суток!
Хочу представить вашему вниманию перевод статьи Джонатана Барлетта (Jonathan Bartlett), который является техническим директором в компании New Medio. Статья была опубликована 16 ноября 2004 года на сайте ibm.com и посвящена методам управления памятью. Хотя возраст статьи достаточно высок (по меркам IT), информация в ней является фундаментальной и описывает подходы к распределению памяти, их сильные и слабые стороны. Всё это сопровождается «самопальными» реализациями, для лучшего усвоения материала.

Аннотация от автора
Решения, компромиссы и реализации динамического распределения памяти
Получите представление о методах управления памятью, которые доступны Linux разработчикам. Данные методы не ограничиваются языком C, они также применяются и в других языках программирования. Эта статья даёт подробное описание как происходит управление памятью, на примерах ручного подхода (manually), полуавтоматического (semi-manually) с использованием подсчёта ссылок (referencing count) или пула (pooling) и автоматического при помощи сборщика мусора (garbage collection).

Читать далее...

Сортировка без if-ов

Время на прочтение2 мин
Охват и читатели39K
Доброго времени суток. Так сложилась жизнь что я от недавнего времени стал гордым студентом одного из лучших вузов своей страны. Хорошо или плохо это вопрос спорный, но это не суть. Самое забавное это то, что на лабораторных работах преподаватель то ли для развлечения, то ли для того, что бы в очередной раз напомнить мне что я весьма паскудно разбираюсь в алгоритмике, время от времени выдает задания отличные от того, что получает оставшаяся группа. Одно из последних, которое, как по мне, достойно вашего внимания является сортировка массива без использования условных операторов (if, switch и тому подобных).
Читать дальше →

Платформа «1С: Предприятие» — что под капотом?

Время на прочтение7 мин
Охват и читатели121K
Привет, Хабр!
В этой статье мы начнем рассказ о том, как устроена внутри платформа «1С:Предприятие 8» и какие технологии используются при ее разработке.

image

Почему мы считаем, что это интересно? Во-первых, потому что платформа «1С:Предприятие 8» — это большое (более 10 миллионов строк кода) приложение на C++ (клиент, сервер и т.д.), JavaScript (веб-клиент), и, с недавних пор еще и Java. Большие проекты бывают интересны хотя бы в силу масштаба, ведь вопросы, незаметные в маленькой кодовой базе, в таких проектах встают в полный рост. Во-вторых, «1С:Предприятие» — это тиражируемый, «коробочный» продукт, а статей про такие разработки на Хабре совсем немного. А еще всегда интересно узнать, как там живут в других командах и фирмах.
Читать дальше →

Поиск неинициализированных членов класса

Время на прочтение4 мин
Охват и читатели10K
Unicorn and class members
К нам достаточно давно обращались клиенты и потенциальные клиенты с просьбой реализовать диагностику для поиска неинициализированных членов класса. Мы долго сопротивлялись, осознавая сложность задачи, но всё-таки сдались. В результате мы создали диагностику V730. Диагностика получилась далеко не идеальной и предвидя множество писем о том, что что-то работает не так, я решил написать заметку о технической сложности этой задачи. Думаю, эта информация заранее даст пользователям PVS-Studio ответы на некоторые вопросы и просто будет интересна широкому кругу наших читателей.
Читать дальше →

Встроить JSON в Embedded? Проще простого

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

Не так давно у меня появилась необходимость загружать конфигурацию приложения при очень ограниченных ресурсах. Не было доступа, практически, ни к каким стандартным функциям C. Очень повезло, что были стандартные функции по работе с памятью malloc()/free().

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

Из этого можно сделать вывод, что надо либо:
  1. Писать свой редактор бинарного формата.
  2. Использовать текстовый формат.

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

Конвертация видео файла в gif

Время на прочтение3 мин
Охват и читатели18K
Мой опыт программирования на с++ насчитывает 5 месяцев, до этого времени я около двух лет разрабатывал приложения для мобильных операционных систем. В один момент мне это надоело, и я решил, что пора начать осуществлять свою юношескую мечту — стать разработчиком игр. И я немного сменил направление движения своей карьеры.

Вот как-то я сидел и думал, что бы мне написать. Я выбрал для себя 16 программок, несколько раз подбросил монетку, и жребий указал мне на программку получения гифки из видео. Кто хочет увидеть дилетантский крестовый код — прошу под кат.
Читать дальше →

Microsoft добавит поддержку компилятора Clang в ноябрьском обновлении Visual Studio 2015

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


Microsoft добавит поддержку компилятора Clang в ноябрськом обновлении Visual Studio 2015 — об этом было заявлено на конференции CPPCon 2015, проходящей сейчас в городе Белвью, США.

Clang это компилятор кода на С, С++ и Objective-C, который в связке с LLVM позволяет собирать программы под различные платформы. Visual Studio 2015 уже поддерживает Clang для разработки Android и iOS-приложений. При разработке под Android можно выбирать между GCC и Clang, а для iOS приходится использовать внешний Mac в качестве билд-сервера.

Планируемое обновление принесёт поддержку Clang на качественно новом уровне — теперь им можно будет собирать обычные Windows-приложения.
Читать дальше →

Схема Блома

Время на прочтение3 мин
Охват и читатели24K
imageВ июне 2015 года в России был принят стандарт блочного шифрования — ГОСТ Р 34.12-2015. Мне стало интересно объединить этот ГОСТ (точнее, полином, который используется в нем) и схему Блома.

Вооружившись исходниками и самим ГОСТом, я приступил к делу. Но для начала немного теории.

Итак, Схема Блома —схема предварительного распределения ключей в сети связи. Принцип её действия таков:
Читать дальше →

Легендарные книги Амазона. Продолжение темы «Elements of Programming Interviews: The Insiders' Guide»

Время на прочтение1 мин
Охват и читатели9.8K
Добрый день, Хабр!

В начале лета мы уже говорили об одной из легенд Амазона «Elements of Programming Interviews: The Insiders' Guide».

imageКнига продолжает занимать первые места в рейтинге Амазона, но в сентябре 2015 года авторы выпустили еще одну книгу, которая тоже сразу стала бестселлером.

Elements of Programming Interviews in Java: The Insiders' Guide
Читать дальше →

C++ Russia в Санкт-Петербурге

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

Всем привет!

Мы закончили обрабатывать видео с конференции C++ Siberia 2015 и собрали их в плейлисте на youtube. Также они доступны на странице конференции.

А ещё у нас есть замечательные новости про конференцию C++ Russia 2016 в Санкт-Петербурге. Вкратце: все будет очень круто.


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

Алло! Это FreeSWITCH? Тогда мы проверим вас

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

По просьбам наших читателей для проверки с помощью PVS-Studio был взят проект с открытым исходным кодом FreeSWITCH. Первоначально он был основан разработчиками проекта, Asterisk, который мы уже проверяли. Проект FreeSWITCH активно разрабатывается и содержит много интересных предупреждений анализатора, которые будут описаны в статье.
Читать дальше →

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

Внешняя сортировка с O(1) дополнительной памяти

Время на прочтение9 мин
Охват и читатели432
Прочитав эту статью, я вспомнил, как писал внешнюю сортировку, которая использовала O(1) внешней памяти. Функция получала бинарый файл и максимальный размер памяти, которую она могла выделить под массив:

void ext_sort(const std::string filename, const size_t memory)

Я использовал алгоритм из Effective Performance of External Sorting with No Additional Disk Space:

  1. Разделим файл на блоки, которые помещаются в доступную память. Обозначим эти блоки Block_1, Block_2, …, Block_(S-1), Block_S. Установим P = 1.
  2. Читаем Block_P в память.
  3. Отсортируем данные в памяти и запишем назад в Block_P. Установим P = P + 1, и если P ≤ S, то читаем Block_P в память и повторяем этот шаг. Другими словами, отсортируем каждый блок файла.
  4. Разделим каждый блок на меньшие блоки B_1 и B_2. Каждый из таких блоков занимает половину доступной памяти.
  5. Читаем блок B_1 блока Block_1 в первую половину доступной памяти. Установим Q = 2.
  6. Читаем блок B_1 блока Block_Q во вторую половину доступной памяти.
  7. Объеденим массивы в памяти с помощью in-place слияния, запишем вторую половину памяти в блок B_1 блока Block_Q и установим Q = Q + 1, если Q ≤ S, читаем блок B_1 блока Block_Q во вторую половину доступной памяти и повторяем этот шаг.
  8. Записываем первую половину доступной памяти в блок B_1 блока Block_1. Так как мы всегда оставляли в памяти меньшую половину элементов и провели слияние со всеми блоками, то в этой части памяти хранятся M минимальных элементы всего файла.
  9. Читаем блок B_2 блока Block_S во вторую половину доступной памяти. Установим Q = S −1.
  10. Читаем блок B_2 блока Block_Q в первую половину доступной памяти.
  11. Объеденим массивы в памяти с помощью in-place слияния, запишем первую половину доступной памяти в блок B_2 блока Block_Q и установим Q = Q −1. Если Q ≥ 1 читаем блок B_2 блока Block_Q в первую половину доступной памяти и повторяем этот шаг.
  12. Записываем вторую половину доступной памяти в блок B_2 блока Block_S. Аналогично шагу 8, тут хранятся максимальные элементы всего файла.
  13. Начиная от блока B_2 блока Block_1 и до блока B_1 блока Block_S, определим новые блоки в файле и снова пронумеруем их Block_1 to Block_S. Разделим каждый блок на блоки B_1 и B_2. Установим P = 1.
  14. Читаем B_1 и B_2 блока Block_P в память. Объеденим массивы в памяти. запишем отсортированный массив назад в Block_P и установим P = P +1. Если P ≤ S, повторяем этот шаг.
  15. Если S > 1, возвращаемся к шагу 5. Каждый раз мы выделяем M минимальных и максимальных элементов, записываем их в начало и конец файла соответственно, а потом делаем то же самое с оставшимися элементами, пока не дойдем до середины файла.

Преимущество такого алгоритма, кроме отсутствия буфера на диске, это то, что с диска мы читаем данные относительно большими порциями, что ускоряет алгоритм.

Реализуем алгоритм на C++.
Читать дальше →

Настройка GPIO в Coremodule 920

Время на прочтение6 мин
Охват и читатели8.4K
Требовалось уметь обращаться к GPIO на Coremodule 920 из под Windows 7 x86. Приложение, которому требовался доступ пишется мной на Java.

Поиск решений


  • Попробовать разобраться самостоятельно
  • Обратиться в техподдержку за помощью

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

Из ответа на мой вопрос следовало, что у них есть драйвер на C и только под Linux, что меня не устраивало.
Читать дальше →

Поисковые подсказки изнутри

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


Ночная зала. Тысячи таинственных ликов в темноте, подсвеченных голубоватым свечением мониторов. Оглушительный треск миллиона клавиш. Подобные выстрелам автомата удары по клавишам «Enter». Зловещее стрекотание сотен тысяч мышек… Так, наверняка, играло воображение каждого разработчика высоконагруженной системы. И если его вовремя не остановить, то может выйти целый триллер или фильм ужасов. Но в данной статье мы будем гораздо ближе к земле. Мы кратко рассмотрим известные подходы к решению задачи поисковых подсказок, как мы научились делать их полнотекстовыми, а также расскажем о парочке уловок, на которые мы пошли, чтобы придать им скорости, но при этом не научить жадности к ресурсам. В конце статьи вас ждёт бонус — небольшой рабочий пример.
Читать дальше →

Добавление нового семейства процессоров в IDA pro

Время на прочтение8 мин
Охват и читатели16K
Пришлось не так давно потрошить прошивку от M16C (Mitsubishi/Renesas). С удивлением обнаружил, что оказывается IDA v6.1.xxx не «держит» данное семейство контроллеров, увы. Впрочем, SDK есть в наличии, значит, не страшно – будем исправлять ситуацию. Как показала практика, ничего сверх сложного в написании своего модуля нет (не rocket science, чай).
Читать дальше →

Неконстантные константные выражения

Время на прочтение24 мин
Охват и читатели40K
// <какой-то код>
 
int main ()
{
        constexpr int a = f ();
        constexpr int b = f ();
 
        static_assert (!= b, "fail");
}

Можно ли в приведенном выше фрагменте вместо комментария вставить такое определение f (), чтобы a получила значение, отличное от b?

“Разумеется, нет!” — скажете вы, немного подумав. Действительно, обе переменные объявлены со спецификатором constexpr, а значит, f () тоже должна быть constexpr-функцией. Всем известно, что constexpr-функции могут выполняться во время компиляции, и, как следствие, не должны зависеть от глобального состояния программы или изменять его (иными словами, должны быть чистыми). Чистота означает, что функция при каждом вызове с одними и теми же аргументами должна возвращать одно и то же значение. f () оба раза вызывается без аргументов, поэтому должна оба раза вернуть одно и то же значение, которое и будет присвоено переменным a и b… правильно?

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

Я ошибался.
Увиденное под катом уже не развидеть

Простой графический редактор с использованием OpenCV

Время на прочтение5 мин
Охват и читатели34K
В этой статье я расскажу, как достаточно быстро и просто написать редактор изображений на C++ с использованием библиотеки компьютерного зрения opencv. Реализованы такие эффекты, как насыщенность, экспозиция, резкость, контрастность и другие. Никакой магии!

image

Внимание! Под катом много графики и кода.
Читать дальше →

Масштабируемая библиотека сериализации/десериализации JSON

Время на прочтение15 мин
Охват и читатели20K
Не так давно я участвовал в проекте написания прошивки для некоторого устройства. В процессе работы возник вопрос, а как, собственно, взаимодействовать с «большим братом» (управляющим компьютером)? Поскольку в качестве «большого брата» закладывались совершенно разные устройства (различные смартфоны, планшеты, ноутбуки с различными ОС и прочее), планировалось использовать web-приложение, что диктовало использование JSON для обмена сообщениями.

В итоге получилась легкая и быстрая библиотека сериализации/десериализации JSON. Основные фичи данной библиотеки:

  • в базовом функционале (без использования контейнеров STL) не использует динамическую память, вообще;
  • состоит только из заголовочных файлов (headers-only);
  • есть поддержка контейнеров STL;
  • позволяет создавать расширения для обработки произвольных типов.

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