The 2-nd lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
The 1st part of the 3rd lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
The 3rd part of the 3rd lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
The 2-nd lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
The 1st part of the 3rd lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
The 3rd part of the 3rd lecture from the course "Java Core".
The Department of Information and Network Technologies.
St-Petersburg State University Of Aerospace Instrumentation.
Russia
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова. Курс "Алгоритмы интеллектуальной обработки больших объемов данных", Лекция №11 "Основы нейронных сетей"
Лектор - Павел Нестеров
Биологический нейрон и нейронные сети. Искусственный нейрон Маккалока-Питтса и искусственная нейронная сеть. Персептрон Розенблатта и Румельхарта. Алгоритм обратного распространения ошибки. Момент обучения, регуляризация в нейросети, локальная скорость обучения, softmax слой. Различные режимы обучения.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9pyyrqknouMZbIPf4l3CwUP
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова. Курс "Алгоритмы интеллектуальной обработки больших объемов данных", Лекция №9 "Алгоритмические композиции. Начало"
Лектор - Владимир Гулин
Комбинации классификаторов. Модельные деревья решений. Смесь экспертов. Stacking. Стохастические методы построения ансамблей классификаторов. Bagging. RSM. Алгоритм RandomForest.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9pyyrqknouMZbIPf4l3CwUP
Лекция №12 "Ограниченная машина Больцмана" Technosphere1
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова. Курс "Алгоритмы интеллектуальной обработки больших объемов данных", Лекция №12 "Ограниченная машина Больцмана"
Лектор - Павел Нестеров
Нейросетейвой автоэнкодер. Стохастические и рекурентные нейронные сети. Машина Больцмана и ограниченная машина Больцмана. Распределение Гиббса. Алгоритм contrastive divergence для обучения РБМ. Сэмплирование данных из РБМ. Бинарная РБМ и гауссово-бинарная РБМ. Влияние регуляризации, нелинейное сжатие размерности, извлечение признаков. Semantic hashing.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9pyyrqknouMZbIPf4l3CwUP
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова. Курс "Алгоритмы интеллектуальной обработки больших объемов данных", Лекция №10 "Алгоритмические композиции. Завершение"
Лектор - Владимир Гулин
Ключевые идеи бустинга. Отличия бустинга и бэггинга. Алгорим AdaBoost. Градиентный бустинг. Мета-алгоритмы над алгоритмическими композициями. Алгоритм BagBoo.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9pyyrqknouMZbIPf4l3CwUP
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова. Курс "Алгоритмы интеллектуальной обработки больших объемов данных", Лекция №7 "Машина опорных векторов"
Лектор - Николай Анохин
Разделяющая поверхность с максимальным зазором. Формулировка задачи оптимизации для случаев линейно-разделимых и линейно-неразделимых классов. Сопряженная задача. Опорные векторы. KKT-условия. SVM для задач классификации и регрессии. Kernel trick. Теорема Мерсера. Примеры функций ядра.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9pyyrqknouMZbIPf4l3CwUP
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных". Лекция №2 "Модификация данных. Выборка данных (начало)"
Лектор - Павел Щербинин.
Сначала завершается рассмотрение типа данных MySQL «Дата и время». Затем рассказывается о создании таблиц (CREATE TABLE): create_definition, column_definition, reference_defenition, обновление кортежа в родительском отношении. Далее обсуждается процедура изменения таблицы (ALTER TABLE), выборка данных и оператор SELECT, а также фильтрация (формирование групп, агрегаторы).
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
Обобщенное программирование - это подход к программированию, когда алгоритм пишется без указания конкретных типов данных. Используя данный подход можно значительно увеличить количество повторно используемого кода. В C++ данный подход реализуется за счет механизма шаблонов. В данном докладе рассмотрим некоторые возможности по обобщенному программированию, которые предоставляет C++. На конкретных примерах рассмотрим, как они могут упростить нам жизнь и с какими трудностями приходится сталкиваться при их использовании.
Дмитрий Прокопцев, Яндекс
Речь пойдёт о, наверное, одном из самых важных и в то же время сложных нововведений в С++11 — R-ссылках (rvalue references). Мы рассмотрим базовые правила работы с такими ссылками и связанные с ними новые концепции языка: перемещение классов, универсальные ссылки и перенаправление вызовов.
Нас окружает мир сетей, мобильных устройств, сайтов, облаков. Чтобы работать с этим миром, придумано невероятное количество технологий и языков программирования. Есть ли среди них место для языков Си/Си++? Стоит ли тратить время на их изучение, стоит ли использовать их в своих проектах? Не пора ли этим языкам на пенсию? Эти темы в своем докладе обсудит Андрей Карпов, активно участвующий в жизни сообщества Си++-программистов. Забегая вперед можно утверждать - языки Си/Си++ живее всех живых. Андрей расскажет о развитии языка и новых возможностях, появившихся в Си++11. Многие возможности существенно облегчают работу программиста и сокращают объем кода.
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
На примере некоторых архитектурных решений Крипты Дмитрий расскажет о способах реализации полиморфного поведения в программах на C++, о преимуществах и недостатках этих способов, а также о новых возможностях C++11.
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
Основываясь на опыте разработки Крипты, Дмитрий рассмотрит средства реализации статического и динамического полиморфизма в C++, а также некоторые их паттерны и антипаттерны.
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
На примере некоторых архитектурных решений Крипты Дмитрий расскажет о способах реализации полиморфного поведения в программах на C++, о преимуществах и недостатках этих способов, а также о новых возможностях C++11.
Версия презентации по основам C++ с летней школы учителей информатики 2016 года.
Презентация расширена слайдами Незнанова А.А., изменён порядок материала, добавлены задачи.
о некоторых вопросах бинарной совместимости в C++corehard_by
При написании кода на C++ часто появляются вопросы о том, как он будет взаимодейтсвовать с внешним миром. Ответить на эти вопросы порой бывает нелегко, и причиной этому служит отсуствие описания ABI в стандарте C++. В докладе рассмотрим, что такое ABI, и как программисты C++ живут в отсутсвии стандарта на него.
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Лекция 5. MapReduce в Hadoop (алгоритмы)Technopark
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Лекция 3. Распределённая файловая система HDFSTechnopark
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
Лекция 1. Введение в Big Data и MapReduceTechnopark
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №10 "Нереляционное решение в области баз данных — NoSQL". Лектор - Станислав Ступников.
Вводная часть посвящена определению и истории развития концепции NoSQL. Даются характеристики, рассказывается о способах использования. Рассматриваются виды NoSQL БД, теоретические основы NoSQL, а в конце лекции обсуждаются недостатки NoSQL-решений, а также проводится сравнение разных NoSQL-решений.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №10 "Нереляционное решение в области баз данных — NoSQL". Лектор - Станислав Ступников.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №9 "Безопасность баз данных". Лектор - Павел Щербинин.
Открывается лекция рассказом о резервном копировании (о логических и физических резервных копиях, о выборе данных для копирования). Затем определяется терминология для обсуждения дальнейших вопросов. После этого рассматриваются основы учётных записей: таблицы доступа, привилегии, виды записей. Обсуждаются SQL-injection, список смежных вершин (Adjacency Set), вложенное множество (Nested Set), материализованный путь (Materialized Path) и комбинированный подход.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №8 "Конфигурирование базы данных"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №8 "Конфигурирование базы данных". Лектор - Павел Щербинин.
Сначала объясняются основы конфигурирования и общие принципы настройки. Далее рассказывается об области видимости, о настройке использования памяти, обсуждается размер блока ключей key_cache_block_size. Рассматривается устройство и использование кэша InnoDB, а также кэшей потоков и таблиц. Затем говорится об особенностях ввода/вывода в InnoDB. Далее рассказывается о табличном пространстве, оптимизации файловой сортировки, переменных состояния. Финальная часть лекции посвящена репликации: настройка, синхронизация, топология, планирование пропускной способности, администрирование и обслуживание, проблемы и их решения.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"Technopark
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №7 "Оптимизация запросов и индексирование". Лектор - Павел Щербинин.
Вначале рассказывается об оптимизации доступа к данным, о декомпозиции соединения и состоянии запроса. Далее идёт большой блок, посвящённый оптимизатору запросов (изменение порядка соединения, применение алгебраических правил эквивалентности, оптимизации COUNT(), MIN(), MAX(), вычисление и свертка константных выражений, покрывающие индексы, оптимизация подзапросов, раннее завершение, сравнение по списку IN() и распространение равенства). Затем последовательно рассматриваются такие вещи, как соединение (JOIN) в MySQL, оптимизатор сортировки, коррелированные подзапросы, слияние и непоследовательный просмотр индексов, функции SELECT & UPDATE, COUNT(). После этого рассказывается об оптимизации запросов с помощью JOIN, GROUP BY, DISTINCT и LIMIT со смещением. В конце лекции даётся информация о кэшировании запросов, объединённых таблицах и секционировании.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №5 "Определение узких мест". Лектор - Павел Щербинин.
Вначале рассказывается о подсистемах хранения: MyISAM, InnoDB, Memory, о критериях выбора подсистем хранения, приводятся практические примеры. Затем обсуждается тема индексирования (B-tree, хеш-индексы) и EXPLAIN (столбцы id, table, possible_keys, key, key_len).
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
Технопарк Mail.ru Group, МГТУ им. Н.Э. Баумана. Курс "Базы данных".
Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-запросы". Лектор - Павел Щербинин.
Лекция открывается рассказом о том, что такое профилирование запроса, каковы его этапы выполнения в MySQL. Рассказывается о том, как планировать запрос, как осуществляется протоколирование запросов, как собирается статистика. Объясняются основы индексирования, подробно обсуждаются стратегии индексирования для достижения высокой производительности: изоляция столбца, кластерные индексы (преимущества и недостатки), размещение данных в MyISAM и InnoDB, покрывающие индексы. Далее затрагивается тема нормализации и денормализации, а также таблиц счётчиков. В завершении рассказывается о версионировании схемы БД: о методах инкрементных изменений, идемпотентных изменений, уподобления структуры БД исходному коду.
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9obOz5K695ugYuiOOCBciEi
2. Лекция №5. Шаблоны классов и
методов. Обработка исключительных
ситуаций. Обобщенное и безопасное
программирование
1. Шаблоны классов и методов.
Обобщенное программирование.
Параметры шаблонов. Специализация,
конкретизация и перегрузка
шаблонов.
2. Рекурсивное определение шаблонов.
Основы метапрограммирования.
Идиома SFINAE.
3. Понятие, поддержка и технология
обработки исключительных ситуаций.
4. Безопасное программирование.
Нейтральность кода. Критерии
безопасности и нейтральности
классов и методов.
5. Безопасность конструкторов и
деструкторов.
6. Исключения в стандартной
библиотеке.
2
3. Шаблоны классов
Шаблон класса — элемент языка, позволяющий параметризовать
типы и значения, используемые для автоматического создания
(конкретизации) классов по обобщенному описанию (шаблону).
Использование шаблонов классов — шаг на пути к парадигме
обобщенного программирования.
Различают описания и определения шаблонов классов. В отличие
от «обычного» класса описания и определения шаблона содержат
списки параметров шаблона, среди которых выделяются
параметры-типы и параметры-константы.
Параметры-типы шаблона класса представляют некоторый тип
данных, параметры-константы — некоторое константное
(вычисляемое при компиляции) выражение.
3
4. Шаблоны классов: пример
template <class T, class U, int size>
// эквивалентно:
// template <typename T, typename U, int size>
class Test
{
public:
Test() : _size(size) // …
private:
T
_prm_1;
U*
_prm_2;
int
_size;
};
4
5. Параметры шаблонов классов
Параметры шаблона класса не могут быть одноименными члену
соответствующего шаблона.
Имя параметра шаблона может присутствовать в списке
параметров лишь один раз.
Имена параметров в объявлении (если есть) и определении
шаблона могут различаться.
Параметры могут иметь значения по умолчанию.
Константные выражения с одинаковыми значениями трактуются
как эквивалентные параметры-константы шаблона класса.
5
6. Конкретизация шаблонов классов
Конкретизация шаблона — это автоматическая генерация
исходного кода конкретного класса в соответствии с заданным
программистом определением шаблона класса.
Конкретизированный шаблон может использоваться везде, где
допустимо использование «обычного» класса (включая описания и
определения шаблонов функций), а экземпляры автоматически
сгенерированного класса — везде, где допустимы «обычные»
объекты.
Шаблон класса конкретизируется тогда, когда впервые требуется
определение автоматически генерируемого класса.
Test<int, double, 10> t_id10;
6
7. Методы шаблонов классов
Методы шаблонов классов также являются шаблонами и
конкретизируются в точке вызова или взятия адреса. При этом
конкретизируемый метод относится к тому классу, через объект
которого вызывается.
template <class T, class U, int size>
Test<T, U, size>::~Test()
{
/* … */
}
7
8. Дружественные объекты
в шаблонах классов
Дружественными по отношению к шаблонам классов могут быть:
дружественная функция или дружественный класс (не шаблон);
связанный шаблон дружественной функции, взаимно однозначно
соответствующий шаблону класса (с общим для обоих шаблонов
списком параметров);
связанный шаблон дружественного класса, взаимно однозначно
соответствующий шаблону класса (с общим для обоих шаблонов
списком параметров);
несвязанный шаблон дружественной функции, соответствующий всем
возможным конкретизациям шаблона класса (с раздельными списками
параметров);
несвязанный шаблон дружественного класса, соответствующий всем
возможным конкретизациям шаблона класса (с раздельными списками
параметров).
8
9. Статические члены шаблонов классов
Шаблоны классов могут содержать статические члены данных,
собственный набор которых имеет каждый конкретизированный
согласно шаблону класс.
template <class T, class U, int size>
class Test
{
/* … */
private:
static Test *_head;
};
template <class T, class U, int size>
Test<T, U, size> *Test<T, U, size>::_head = NULL;
9
10. Специализация шаблонов классов.
Специализация члена класса: пример
Шаблоны классов в языке C++ допускают частичную (полную)
специализацию, при которой отдельные (все) параметры шаблона
заменяются конкретными именами типов или значениями
константных выражений.
// специализация члена класса
template<>
void Test<int, double, 10>::foo()
{
/* … */
}
10
11. Полная и частичная
специализация класса: пример
// полная специализация класса
template<> class Test<int, double, 100>
{
public:
Test<int, double, 100>();
~Test<int, double, 100>();
void foo(); /* … */
};
// частичная специализация класса
template <class T, class U> class Test<T, U, 100>
{
public:
Test();
~Test (); /* … */
};
11
12. Рекурсивное определение шаблонов
как пример метапрограммирования
template <unsigned long N>
struct binary {
static unsigned const value
= binary<N / 10>::value << 1 | N % 10;
};
template <>
struct binary<0> {
static unsigned const value = 0;
};
unsigned const one
= binary<1>::value;
unsigned const three = binary<11>::value;
unsigned const five = binary<101>::value;
12
13. Идиома SFINAE
Идиома SFINAE (англ. Substitution Failure Is Not An Error —
«неудача при подстановке не есть ошибка») является одной из
идиом обобщенного программирования и означает ситуацию, при
которой невозможность подстановки параметров шаблона не
влечет аварийного завершения компиляции.
Ситуация, соответствующая идиоме SFINAE, возникает при
разрешении перегруженных вызовов, в которых среди
множества функций-кандидатов найдется хотя бы одна,
полученная в результате конкретизации шаблона.
В соответствии с логикой идиомы SFINAE, неудача при
подстановке параметров в соответствующий шаблон ведет лишь к
удалению данного шаблона из множества кандидатов и не имеет
катастрофических последствий для компиляции.
13
15. Интроспекция времени компиляции в
библиотеке boost::type_traits
Цель. Через набор узкоспециализированных, имеющих единый
дизайн вспомогательных классов упростить работу с атомарными
характеристиками типов (англ. type traits) в системе типов языка
C++.
Библиотека.
#include <boost/type_traits.hpp>
Реализация. Библиотека характеристик типов содержит
значительное количество внутренне весьма однородных классов
(структур), многие из которых открыто наследуют типам true_type
или false_type (см. далее).
15
16. Характеристики типов:
структуры is_void, is_pointer
// структура is_void
template <typename T>
struct is_void : public false_type{};
template <>
struct is_void<void> : public true_type{};
// структура is_pointer
template <typename T>
struct is_pointer: public false_type{};
template <typename T>
struct is_pointer<T*> : public true_type{};
16
17. Характеристики типов:
структуры true_type и false_type
template <class T, T val>
struct integral_constant
{
typedef integral_constant<T, val>
typedef T
static const T
};
type;
value_type;
value = val;
typedef integral_constant<bool, true> true_type;
typedef integral_constant<bool, false> false_type;
17
18. Характеристики типов:
иерархии классов
Проиллюстрированный подход позволяет строить параллельные
иерархии классов, обладающих (потомки true_type) и не
обладающих (потомки false_type) искомыми свойствами.
Принадлежность к соответствующей иерархии является
различительным признаком.
18
19. Характеристики типов:
структура remove_extent
Установить тип элемента массива позволяет структура
remove_extent.
template <typename T>
struct remove_extent
{
typedef T type;
};
template <typename T, std::size_t N>
struct remove_extent<T[N]>
{
typedef T type;
};
19
20. Характеристики типов:
оптимизация функций (общий случай)
Имея эффективную реализацию функции для типов с
конкретными характеристиками, нетрудно должным образом
специализировать ее шаблон. Например, для std::copy имеем:
template<typename I1, typename I2, bool b>
I2 copy_imp(I1 first, I1 last, I2 out,
const boost::integral_constant<bool, b>&)
{
while(first != last)
{
*out = *first;
++out; ++first;
}
return out;
}
20
22. Характеристики типов: оптимизация
функций (вызывающая функция)
template<typename I1, typename I2>
inline I2 copy(I1 first, I1 last, I2 out)
{
typedef typename std::iterator_traits<I1>::
value_type value_type;
return copy_imp(first, last, out,
boost::has_trivial_assign<value_type>());
}
22
23. Характеристики типов: исключение
деструкторов (вызов ~T() обязателен)
Столь же нетрудно избежать накладных расходов на вызов
деструкторов в случаях, когда этого допускает структура
соответствующих классов.
template<class T>
void do_destroy_array(T* first, T* last,
const boost::false_type&)
{
while(first != last)
{
first->~T();
++first;
}
}
23
25. Понятие исключительной
ситуации (1 / 2)
Естественный порядок функционирование программ нарушают
возникающие нештатные ситуации, в большинстве случаев
связанные с ошибками времени выполнения (иногда — с
необходимостью внезапно переключить контекст приложения).
В языке C++ такие нештатные ситуации называются
исключительными (иначе говоря — исключениями).
Примерами исключительных ситуаций являются:
нехватка оперативной памяти;
попытка доступа к элементу коллекции по некорректному индексу;
попытка недопустимого преобразования динамических типов и пр.
25
26. Понятие исключительной
ситуации (2 / 2)
Архитектурной особенностью механизма обработки
исключительных ситуаций в языке C++ является
принципиальная независимость (несвязность) фрагментов
программы, где исключение возбуждается и где оно
обрабатывается.
Обработка исключительных ситуаций носит невозвратный
характер.
26
27. Объекты-исключения.
Оператор throw
Носителями информации об аномальной ситуации (исключении) в
C++ являются объекты заранее выбранных на эту роль типов
(пользовательских или — Sic! — базовых, например, char*). Такие
объекты называются объектами-исключениями.
Жизненный цикл объектов-исключений начинается с возбуждения
исключительной ситуации посредством оператора throw:
throw "Illegal cast";
/* … */
throw IllegalCast();
/* … */
enum EPrgStatus
{psOK, psBadIndex,
throw psIllegalCast;
// char *
// class IllegalCast
psIllegalCast};
// enum EPrgStatus
27
28. Защищенные блоки.
Операторы try, catch
Небезопасные с точки зрения исключений фрагменты кода могут
инкапсулироваться в защищенный (контролируемый) блок, за
которым следует один или несколько связанных с ним блоковобработчиков исключений. Защищенные блоки кода начинаются
ключевым словом try, блоки-обработчики — словом catch.
При возбуждении исключения в одном из операторов
защищенного блока все следующие за ним операторы блока
автоматически пропускаются, а управление передается
ближайшему соответствующему блоку-обработчику исключения.
Если такой блок не найден, управление берет на себя стандартная
функция terminate(). Иначе обработку исключительной ситуации
берет на себя первый подходящий для этого блок в порядке их
указания в исходном коде.
28
30. Функциональные защищенные блоки
Как защищенный блок может быть оформлена не только часть
функции, но и функция целиком (в том числе main() и
конструкторы классов). В таком случае защищенный блок
называют функциональным. Например:
void foobar()
try {
/* … */
}
catch( /* … */ ) { /* … */ }
catch( /* … */ ) { /* … */ }
catch( /* … */ ) { /* … */ }
30
31. Варианты описания исключений
Описание исключения в блоке-обработчике может содержать имя
типа, объекта, ссылки или указателя на объект.
catch(IllegalCast) { /* … */ }
catch(IllegalCast ic)
{ /* … */ }
catch(IllegalCast &ric)
{ /* … */ }
catch(IllegalCast *pic)
{ /* … */ }
31
32. Раскрутка стека
и уничтожение объектов
Поиск catch-блока, пригодного для обработки возбужденного
исключения, приводит к раскрутке стека — последовательному
выходу из составных операторов и определений функций.
В ходе раскрутки стека происходит уничтожение локальных
объектов, определенных в покидаемых областях видимости. При
этом деструкторы локальных объектов вызываются штатным
образом (строгая гарантия C++).
Исключение, для обработки которого не найден catch-блок,
инициирует запуск функции terminate(), передающей управление
функции abort(), которая аварийно завершает программу.
32
33. Повторное возбуждение исключения
и универсальный блок-обработчик
Оператор throw без параметров помещается (только) в catch-блок
и повторно возбуждает обрабатываемое исключение. При этом его
копия не создается:
throw;
Особая форма блока-обработчика исключений осуществляет
перехват любых исключений:
catch(...)
{ /* … */ };
33
34. Безопасность ПО
как показатель качества
Безопасность — один из показателей качества ПО, оцениваемый
путем статического анализа состава и взаимосвязей
используемых компонентов, исходного кода и схемы БД.
Для обеспечения «структурной безопасности» исходного кода
необходимо соблюдение стандартов разработки архитектуры и
стандартов кодирования.
Примечание: См. модели качества ПО, описанные в стандартах:
ГОСТ Р ИСО/МЭК 9126-93. Информационная технология. Оценка
программной продукции. Характеристики качества и руководства по их
применению;
ISO/IEC 9126:2001. Software Engineering — Product Quality;
ISO/IEC 25010:2011. Systems and Software Engineering — Systems and
software Quality Requirements and Evaluation (SQuaRE) — System and
software quality models.
34
35. Стандарты кодирования —
за «безопасный код»
Структурная безопасность исходного кода ПО требует соблюдения
определенных техник кодирования, одной из которых является
систематическая обработка ошибок и исключительных ситуаций
на всех уровнях архитектуры (уровень представления, уровень
бизнес-логики, уровень (базы) данных).
Одним из элементов обработки ошибок и исключений является
спецификация (ограничение) типов исключений, которые могут
порождать структурные элементы кода.
35
36. Безопасность классов и методов
Функция C++ безопасна, если она не возбуждает никаких
исключений или все возбужденные внутри нее исключения
обрабатываются в ее теле.
Класс C++ безопасен, если безопасны все его методы.
В свою очередь, небезопасные функции могут специфицировать
исключения, возбуждением которых (и только их!) способно
завершиться исполнение таких функций. Обнаруженное при
исполнении нарушение гарантии влечет за собой вызов функции
unexpected(), по умолчанию вызывающей terminate().
Виртуальные функции в производных классах могут повторять
спецификации исключений функций в базовых классов или
накладывать более строгие ограничения.
36
37. Безопасность
классов и методов: пример
// описания функций
int foo(int &i) throw();
bool bar(char *pc = 0) throw(IllegalCast);
void foobar() throw(IllegalCast, BadIndex);
// определения функции
int foo(int &i) throw()
{
/* … */}
bool bar(char *pc = 0) throw(IllegalCast)
{
/* … */}
void foobar() throw(IllegalCast, BadIndex)
{
/* … */}
37
38. Безопасность конструкторов
Конструкторы, как и другие методы классов, могут возбуждать
исключения.
Для обработки всех исключений, возникших при исполнении
конструктора, его тело и список инициализации должны быть
совместно помещены в функциональный защищенный блок.
Beta::Beta(int value)
try
: Alpha(foo(value))
{
// тело конструктора
/* … */
}
catch(...) { /* … */ }
38
39. Безопасность деструкторов
Деструкторы классов не должны возбуждать исключения. Одной
из причин этого является необходимость корректного
освобождения ресурсов, занятых массивами и коллекциями
объектов:
если вызываемая в деструкторе функция может возбудить исключение,
деструктор должен перехватить и обработать его (возможно, прервав
программу);
если возможность реакции на исключение необходима клиентам класса
во время некоторой операции, в его открытом интерфейса должна быть
функция (не деструктор!), которая такую операцию выполняет.
В общем случае деструктор класса может специфицироваться как
throw():
~Alpha() throw();
39
40. Безопасность или нейтральность кода?
От безопасности программного кода важно отличать
нейтральность, под которой, согласно терминологии Г. Саттера
(Herb Sutter), следует понимать способность методов класса
прозрачно «пропускать сквозь себя» объекты-исключения,
полученные ими на обработку, но не предназначенные для них.
Нейтральный метод:
может обрабатывать исключения;
должен ретранслировать полученные им исключения методуобработчику в неизменном виде и сохранять свою работоспособность
при любых обстоятельствах.
40
41. Пользовательские и стандартные
классы исключительных ситуаций
Для передачи из точки возбуждения исключения в точку его
обработки сведений об условиях возникновения аномалии
программист может определять и использовать собственные
классы исключительных ситуаций.
Такие классы могут быть сколь угодно простыми (включая
пустые) или сложными (содержащими члены данных,
конструкторы, деструкторы и интерфейсные методы).
Стандартная библиотека языка C++ содержит собственную
иерархию классов исключений, являющихся прямыми или
косвенными потомками базового класса exception. Потомки класса
exception условно представляют две категории ошибок:
логические ошибки и ошибки времени исполнения.
41
43. Стандартные классы ―
логические ошибки
В число классов категории «логические ошибки» входят базовый
промежуточный класс logic_error, а также производные от него
специализированные классы:
invalid_argument
out_of_range
length_error
domain_error
—
—
—
—
ошибка «неверный аргумент»;
ошибка «вне диапазона»;
ошибка «неверная длина»;
ошибка «вне допустимой области».
43
44. Стандартные классы ―
ошибки времени исполнения
В число классов категории «ошибки времени исполнения» входят
базовый промежуточный класс runtime_error, а также
производные от него специализированные классы:
range_error
— ошибка диапазона;
overflow_error
— переполнение;
underflow_error — потеря значимости.
44
45. Прочие классы исключений стандартной
библиотеки
Также производными от exception являются классы bad_alloc и
bad_cast, сигнализирующие об ошибках при выделении
динамической памяти и неудаче при выполнении «ссылочного»
варианта операции dynamic_cast, соответственно.
45