Во многих языках программирования существует возможность объявлять объекты и переменные константными. И, соответственно, существуют рекомендации делать так, если Вы не собираетесь менять их значения. С приходом нового стандарта, в С++ появилась рекомендация возвращать объекты из функций по значению, потому что даже без RVO можно повысить производительность программы, за счет использования семантики перемещения. Что же будет, если использовать эти две рекомендации вместе: вернуть константный объект по значению? Попробуем разобраться далее.
Читать полностью »
Рубрика «c++» - 227
Return by value и const variables в C++11
2013-06-16 в 7:04, admin, рубрики: c++, move semantics, С++, с++11, метки: move semantics, С++, с++11Qt Graphics Framework — темная сторона. Часть 1
2013-06-15 в 13:43, admin, рубрики: c++, qt, Qt Software, Программирование, темные стороны документации, метки: Qt, темные стороны документацииВ первой статье я рассказывал как мог о достоинствах фреймворка. Сегодня я попытаюсь рассказать о его меной стороне, плохо освещенной в документации.
Дело №1
Мы хотим изменять размер сцены и объектов в ней согласно размеру отображаемого окна. В доке сказано:«QGraphicsView takes ownership of the viewport widget». Ну что-ж, создадим простейшим проект и напишем следующее:Читать полностью »
Switch для двух параметров в С++
2013-06-14 в 10:13, admin, рубрики: c++, constexpr, static_assert, switch, Песочница, Программирование, метки: c++, constexpr, static_assert, switch Читая посты на Хабре, наткнулся на такой вопрос. В комментариях были предложены решения, но ни одно не подходило автору в виду накладных расходов на вызовы функций. И тогда я задумался, а действительно почему бы не использовать обычный switch, рассчитывая из двух параметров один хеш, который и использовать в switch. Но глянув на пример автора вопроса внимательнее я понял, что такой вариант просто так не пройдет, так как надо отлавливать default вложенных switch'ей.
Читать полностью »
Особенности получения пакетов через raw socket в Linux
2013-06-14 в 8:16, admin, рубрики: c++, linux, sniffer, socket, никто не читает теги, метки: c++, linux, sniffer, socket, никто не читает теги
Linux (в отличии, к примеру, от FreeBSD) позволяет использовать сырые сокеты не только для отправки, но и для получения данных. В этом месте существуют интересные грабли, на которые я наступил. Теперь спешу показать их тем, кто еще на знает, чтобы каждый, используя свой любимый язык программирования, будь то C++ или Python, мог опробовать их в деле.
Суть граблей изображена на рисунке, чтобы те, кто уже в курсе, не тратили свое время.
Читать полностью »
Десять возможностей C++11, которые должен использовать каждый C++ разработчик
2013-06-10 в 20:27, admin, рубрики: c++, c++11, move semantics, shared_ptr, smart pointers, static_assert, weak_ptr, Программирование, разработка, метки: c++, c++11, move semantics, shared_ptr, smart pointers, static_assert, weak_ptr В данной статье рассматривается ряд возможностей С++11, которые все разработчики должны знать и использовать. Существует много новых дополнений к языку и стандартной библиотеке, эта статья лишь поверхностно охватывает часть из них. Однако, я полагаю, что некоторые из этих новых функций должны стать обыденными для всех разработчиков С++. Подобных статей наверное существует много, в этой я предприму попытку составить список возможностей, которые должны войти в повседневное использование.
Сегодня в программе:
auto
nullptr
- range-based циклы
override
иfinal
- строго-типизированный
enum
- интеллектуальные указатели
- лямбды
- non-member
begin()
иend()
static_assert
и классы свойств- семантика перемещения
Полиморфизм без виртуальных функций
2013-06-10 в 13:05, admin, рубрики: c++, CRTP, pattern, sfinae, virtual, ненормальное программирование, ооп, полиморфизм, метки: c++, CRTP, pattern, sfinae, virtual, ооп, полиморфизмВ этой статье представлен паттерн, который может быть использован для обеспечения динамического связывания без использования виртуальных функций для вызова перегруженных методов для объектов неоднородного контейнера при его обходе. Читать полностью »
Одним махом 100 миллионов убивахом. Или lock-free распределитель памяти
2013-06-10 в 5:41, admin, рубрики: atomic, c++, c++11, lock-free, threads, параллельное программирование, Программирование, метки: atomic, c++11, lock-free, threadsПостановка задачи
Один из алгоритмов, который я реализовывал, имел интересные особенности при работе с памятью:
- Могло выделяться огромное количество, до десятков и сотен миллионов небольших объектов одного типа.
- Объекты представляли собой POD- типы.
PODA Plain Old Data Structure in C++ is an aggregate class that contains only PODS as members, has no user-defined destructor, no user-defined copy assignment operator, and no nonstatic members of pointer-to-member type.
- Заранее было неизвестно какое количество объектов понадобится, могло так случится, что потребуется сотня, а может и сто миллионов.
- Объекты никогда не удаляются по одному, в какой-то момент они становятся не нужны все сразу.
- Алгоритм хорошо распараллеливается, по этому выделением объектов занимается одновременно несколько потоков, по количеству ядер процессора(ов).
Использование в таких условиях стандартного new – delete приводит к очень большим потерям времени на удаление объектов. Если без отладчика удаление происходило хотя бы за несколько секунд, то в присутствии отладчика освобождение памяти замедляется примерно в 100(!) раз, и отладка проекта становится просто невозможной. Кроме того из-за большого количества выделенных объектов достаточно ощутимым становился перерасход памяти на внутренние данные расперделителя памяти.
Для решения задачи выделения огромного количества объектов одного типа, и их пакетного удаления, был сделан lock-free контейнер MassAllocator. Код компилируется Visual Studio 2012. Полный код проекта выложен на github.
Читать полностью »
QML Camera: передача изображения в C++ код
2013-06-09 в 18:33, admin, рубрики: c++, QML, qt, qt quick, Qt Software, qt5, QtQuick В данной статье рассмотрен пример приложения, написанного с использованием Qt 5 и Qt Multimedia, которое использует QML-компонент Camera и передаёт изображение в C++ код для дальнейшей обработки.
Читать полностью »
Создание QR-кодов на C/C++
2013-06-08 в 20:47, admin, рубрики: c++, код, Программирование, метки: c++, код
Это простой пример использования библиотеки libqrencode от FUKUCHI Kentaro для генерации bmp-файла с QR-кодом для какого-то текста. В интернете полно ссылок на эту библиотеку, но ни одного примера ее использования. libqrencode
поддерживает QR Code model 2, описанный в JIS (Japanese Industrial Standards) X0510:2004 или ISO/IEC 18004. В настоящее время не поддерживаются режимы ECI и FNC1 QR Code model 1.
Читать полностью »
Потоки, блокировки и условные переменные в C++11 [Часть 2]
2013-06-08 в 18:41, admin, рубрики: c++, c++11, condition variables, deadlocks, locks, Mutex, threads, windows, блокировки, взаимоблокировки, все равно никто не читает метки, мьютекс, потоки, Программирование, условные переменные, метки: c++, c++11, condition variables, deadlocks, locks, mutex, threads, блокировки, взаимоблокировки, все равно никто не читает метки, мьютекс, потоки, условные переменные Для более полного понимания этой статьи, рекомендуется прочитать ее первую часть, где основное внимание было уделено потокам и блокировкам, в ней объяснено много моментов (терминов, функций и т.д.), которые без пояснения будут использованы здесь.
В данной статье будут рассмотрены условные переменные… Читать полностью »