суббота, 30 марта 2019 г.

C/C++: лезем внутрь


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

четверг, 28 марта 2019 г.

Выбор варианта перегруженной функции в С++

Сложная тема. Если на cppreference почитать - вообще страх. Но можно для начала почитать Resolving function overloads - хорошо рассказано, правда, в основном про случай одного аргумента.

воскресенье, 24 марта 2019 г.

Шаблонная функция в нешаблонном классе

Такую функцию сделать можно. Но если схема компиляции раздельная (описание класса -в .h, а определение методов - в .cpp), то нужны дополнительные телодвижения.

Как пишут на stackoverflow, в конце cpp-шника придется явно выписывать все необходимые конкретизации шаблонного метода.

И приводят вот такой пример:
// .h file
class Foo
{
public:
template void some_method(T t);
}

// .cpp file
//...
template void Foo::some_method(T t) 
{//...}
//...

template void Foo::some_method < int >(int);
template void Foo::some_method < double >(double);

четверг, 21 марта 2019 г.

Лекция: STL

Об STL рассказывать сложно. Перечислять контейнеры и алгоритмы? Скучно, да и все равно всего не охватишь. Можно так:

  1. STL - часть std
  2. контейнеры vector и list
  3. требования к типу хранимого значения T (CopyConstructible, CopyAssignable)
  4. параметр шаблона контейнера Allocator, значение по умолчанию - std::allocator
  5. итераторы (iterator, reverse_iterator, const_iterator)
  6. итератор - пример класса, описанного внутри класса
  7. свойства итераторов у разных контейнеров (какие операции можно делать с ними, можно ли сравнивать и т.д.)
  8. цикл по диапазону for_each; функтор
  9. удаление по условию; remove_if; предикат
Как я уже писал, в 17х плюсах iterator считается устаревшим.  На cppreference.com он помечен как LegacyBidirectionalIterator. Информации по итераторам в STL в интернете как-то маловато. Мне больше всего понравилась статья на geeksforgeeks. 

суббота, 16 марта 2019 г.

STL в быстро меняющемся C++

Современное программирование на C++, как я понимаю - это интенсивное использование стандартной библиотеки. А STL - это часть этой самой стандартной библиотеки.

Контейнеры хороши тем, что с ними работать безопаснее, чем с указателями. А что там с эффективностью? Статья Do not waste time with STL vectors наглядно показывает, что push_back у vector - это весьма медленная операция (быстрее всего заполнять vector с помощью [] - как обычный массив). А вот инициализация вида
vector< int > v = {10, 23} 
появилась только в C++11.

Кстати, чтоб push_back работал побыстрее, можно перед заполнением зарезервировать память (reserve()). Но если при этом еще и в конструкторе вектора указать длину - программа повиснет...

Зато есть возможность проверки выхода за границу - используя at() вместо operator[] (как подсказывают здесь). Если происходит выход за диапазон - кидается исключение std::out_of_range (описано в < stdexcept >)

А в 17м C++ уже объявили std::iterator устаревшим. Подробнее - std::iterator is deprecated: Why, What It Was, and What to Use Instead

Вот так все быстро меняется...

среда, 13 марта 2019 г.

Полиморфизм в C++

Все время путаюсь в разновидностях этого понятия, поэтому сделаю короткую запись. Ориентируюсь на этот пост.

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

Динамический полиморфизм (overriding) - какой конкретно метод будет вызван, станет известно во время выполнения.

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

Автор поста определяет понятие полиморфизма очень коротко: множество функций с одинаковым названием.

четверг, 7 марта 2019 г.

Ссылки: Docker

Полезные ссылки на  статьи по Докеру будут здесь.

Русскоязычное сообщество Docker
https://docker.crank.ru/
 Мне там, например, понравилась статья Управление данными в контейнерах  (volume и т.д.)

Полное практическое руководство по Docker
https://habr.com/ru/post/310460/




Ссылки: С++

В этом посте будет сборник полезных ссылок на материалы по C++

 C++ 11 FAQ от Бьярна Страуструпа. Очень хороший подробный обзор.
http://sergeyteplyakov.blogspot.com/2012/05/c-11-faq.html

The many faces of operator new in C++
https://eli.thegreenplace.net/2011/02/17/the-many-faces-of-operator-new-in-c

Алёна C++: Приведение типов в C++
http://alenacpp.blogspot.com/2005/08/c.html

7 Features of C++17 that will simplify your code (можно компилировать код прямо в тексте статьи; в 17м стандарте есть автоматическое выведение типов у шаблонов!)
https://www.codingame.com/playgrounds/2205/7-features-of-c17-that-will-simplify-your-code/introduction

С++ FAQ Lite (вообще не lite, размер порядочный)

http://www.parashift.com/c++-faq-lite/ 

среда, 6 марта 2019 г.

Docker: работа с файлами

Посмотрим, как создавать файлы в контейнеры, а потом копировать их на жесткий диск своей физической машины.

Запустим контейнер с Redis на основе Alpine:
docker run --name mredis -d redis:alpine
Флажок -d, кстати, означает detach -открепленный режим (без доступа к терминалу, по сути фоновый).

Запустим внутри контейнера командную оболочку ash (в Alpine нет bash, только sh и ash):
docker exec -it mredis /bin/ash
Флаги: -i - интеракт режим (stdin остается открытым, даже если к нему нет прикрепления), -t  - открыть псевдотерминал.

В терминале выполним:
echo "Hello world" > /home/test.txt
Файл /home/test.txt будет существовать внутри контейнера. После выхода из оболочки (командой exit) он продолжит существовать. Его можно скопировать на диск так:
docker exec -it mredis cat /home/test.txt  > HELLO.txt

Файл HELLO.txt будет размещен в текущей директории (из которой выполняем команды над контейнерами).