Блог пользователя Илья Лесной

Права на bind

В Linux (в используемых мной) дистрибутивах, для присвоению сокету адреса функцией bind требуются привелегии, невходящие в набор стандартного пользователя. Это безопасно, но не удобно при разработке.
Поэтому очень удобно сделать так:
#setcap CAP_NET_BIND_SERVICE=+eip /path/to/binary.
Читать далее...

ВНИМАНИЕ. Репрессии.

Регистрация в блоге открыта. Но учетки, которые зарегались и не создали ни одного поста (и имеют с моей точки зрения подозрительный адрес почты) будут удалены.
no spam








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

язык Java глазами плюсовика.

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

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

Но язык этот очень прост, знаниями этого языка никого не удивишь. К тому же на его синтаксисе построено много других языков. Но даже знать полностью Си, и успешно справиться, например с программой ВУЗа используя этот язык, вовсе не означает что Вы хороший специалист (или вообще специалист) языка Си. Это означает только то, что Вы просто знаете как на нём писать, не более.

Рис.1. Краткое содержание материала.
Читать далее...

Аллокаторы в C++. Или свой распределитель памяти.

"Allocator" - переводится как "распределитель" - попросту говоря аллокатор - это действующая по определённой логике высокоуровневая прослойка между запросами памяти под динамические объекты и стандартными сервисами выделения памяти (new/malloc или другими (например запросами напрямую к ядру о.с.)), конечно же прослойка берет на себя и вопросы управлением отдачей уже ненужной памяти назад. По другому можно сказать - что аллокатор это реализация стратегии управления памятью.

Использование аллокаторов позволяет добиться существенного повышения производительности в работе с динамическими объектами (особенно с объектами-контейнерами). Если в коде много работы по созданию/уничтожению динамических объектов, и нет никакой стратегии управления памятью, а только использование стандартных сервисов new/malloc - то весьма вероятно, что не смотря на то, что программа написанна на Си++ (или даже чистом Си) - она окажется более медленной чем схожая программа написанная на Java или C#.
Читать далее...

Обход директории в Linux/Unix.

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

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

Полное удаление каталога в POSIX может выглядеть так:

  1. bool FilesManager::removeDirectory(const char* path) noexcept
  2. {
  3. auto fl = [](const char *file, const struct stat *_stat, int type, struct FTW * _ftw) -> int
  4. {
  5. return remove(file);
  6. };
  7. return (!nftw(path, fl, getdtablesize()/2, FTW_PHYS|FTW_DEPTH)) ? true: false;
  8. }

/* Так же в комментариях под записью будет важное замечание про лямды, функторы и указатели на функции. */
Читать далее...

Посравниваем несравнимое? ) или немного метапрограммирования

Первая заметка за жизнь в этом блоге, но в ней будет и полезное про программирование)

Недавно довелось быть приглашенным в очень интересный проект, спасибо одному форму. Не знал что такое работает - просто написал мол "изучаю ++, буду рад принять участие в любом проекте на этом языке". Писал даже без надежды, просто так.. В итоге совершенно не ожидал что после этого:

  1. Действительно можно быть приглашенным в проект.
  2. Проект окажется не херней типа собрались джуны писать примитивную игрушку*/мессенджер/шифратор и т.п... (т.е. не бессмысленным, а вполне себе и технологически качающим скилл, и более того имеющим шанс по завершению на монетизацию, или по крайней мере на востребованность в рамках free software).
  3. То что буду приглашен не в один проект, при том новые приглашения будут не в менее крутые проекты, даже такие, которые уже приносят монеты их авторам**.

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

Ньансы функций времени компиляции

Это не самостоятельная статья, а инкапсуляция некоторых подробностей данной статьи

Рассмотрим обычный шаблон ф-ии, но с constexpr

Почему в Си++ нужно использовать nullptr а не 0 или тем более не NULL

Начну рассказ с Си. Не секрет, что указатель, с которым ведется работа, всегда должен быть проинициализирован. Т.е. он должен или на что-то указывать (на реально существующий объект в памяти) или же быть нулевым. Это защищает от потенциальных проблем связанных с возможностью разыменования указателя, который не указывает ни на что (вообще разыменование такого указателя - это Undefined Behavior, но жизнь складывается так что это
Читать далее...

Разбор "по полочкам" паттерна Singleton.

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

Наткнулся на интересную особенность "плюсов", на основе которой построен целый паттерн проектирования - называемый Singleton, или по-русски говоря "Одиночка".
Читать далее...

Тайны std::declval, или как "обманывать" компилятор

Это не самостоятельная статья, а инкапсуляция этой статьи.

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

Возьмем немного измененный пример из описания самой std::declval - http://en.cppreference.com/w/cpp/utility/declval. Есть два класса, один с конструктором по-умолчанию, и один без такого конструктора:
Читать далее...

Страницы