суббота, 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);
Как пишут на stackoverflow, в конце cpp-шника придется явно выписывать все необходимые конкретизации шаблонного метода.
И приводят вот такой пример:
// .h file
class Foo
{
public:
template
}
// .cpp file
//...
template
{//...}
//...
template void Foo::some_method < int >(int);
template void Foo::some_method < double >(double);
четверг, 21 марта 2019 г.
Лекция: STL
Об STL рассказывать сложно. Перечислять контейнеры и алгоритмы? Скучно, да и все равно всего не охватишь.
Можно так:
- STL - часть std
- контейнеры vector и list
- требования к типу хранимого значения T (CopyConstructible, CopyAssignable)
- параметр шаблона контейнера Allocator, значение по умолчанию - std::allocator
- итераторы (iterator, reverse_iterator, const_iterator)
- итератор - пример класса, описанного внутри класса
- свойства итераторов у разных контейнеров (какие операции можно делать с ними, можно ли сравнивать и т.д.)
- цикл по диапазону for_each; функтор
- удаление по условию; 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 с помощью [] - как обычный массив). А вот инициализация вида
Кстати, чтоб push_back работал побыстрее, можно перед заполнением зарезервировать память (reserve()). Но если при этом еще и в конструкторе вектора указать длину - программа повиснет...
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
Вот так все быстро меняется...
А в 17м C++ уже объявили std::iterator устаревшим. Подробнее - std::iterator is deprecated: Why, What It Was, and What to Use Instead
Вот так все быстро меняется...
среда, 13 марта 2019 г.
Полиморфизм в C++
Все время путаюсь в разновидностях этого понятия, поэтому сделаю короткую запись. Ориентируюсь на этот пост.
Статический полиморфизм - когда во время компиляции известно, какой код будет выполняться (или какая функция будет вызвана) в данном месте программы. Пример - перегрузка функций. Использование шаблонов - сюда же.
Динамический полиморфизм (overriding) - какой конкретно метод будет вызван, станет известно во время выполнения.
Иногда выделяют параметрический полиморфизм - шаблоны. Его имеет смысл выделять, потому что для полиморфного поведения шаблона необходимо указать параметр, а в других выидах полиморфизма - не нужно.
Автор поста определяет понятие полиморфизма очень коротко: множество функций с одинаковым названием.
Статический полиморфизм - когда во время компиляции известно, какой код будет выполняться (или какая функция будет вызвана) в данном месте программы. Пример - перегрузка функций. Использование шаблонов - сюда же.
Динамический полиморфизм (overriding) - какой конкретно метод будет вызван, станет известно во время выполнения.
Иногда выделяют параметрический полиморфизм - шаблоны. Его имеет смысл выделять, потому что для полиморфного поведения шаблона необходимо указать параметр, а в других выидах полиморфизма - не нужно.
Автор поста определяет понятие полиморфизма очень коротко: множество функций с одинаковым названием.
четверг, 7 марта 2019 г.
Ссылки: Docker
Полезные ссылки на статьи по Докеру будут здесь.
Русскоязычное сообщество Docker
https://docker.crank.ru/
Мне там, например, понравилась статья Управление данными в контейнерах (volume и т.д.)
Полное практическое руководство по Docker
https://habr.com/ru/post/310460/
Русскоязычное сообщество 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/
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 будет размещен в текущей директории (из которой выполняем команды над контейнерами).
Подписаться на:
Сообщения (Atom)