Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
Обобщенное программирование - это подход к программированию, когда алгоритм пишется без указания конкретных типов данных. Используя данный подход можно значительно увеличить количество повторно используемого кода. В C++ данный подход реализуется за счет механизма шаблонов. В данном докладе рассмотрим некоторые возможности по обобщенному программированию, которые предоставляет C++. На конкретных примерах рассмотрим, как они могут упростить нам жизнь и с какими трудностями приходится сталкиваться при их использовании.
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
Обобщенное программирование - это подход к программированию, когда алгоритм пишется без указания конкретных типов данных. Используя данный подход можно значительно увеличить количество повторно используемого кода. В C++ данный подход реализуется за счет механизма шаблонов. В данном докладе рассмотрим некоторые возможности по обобщенному программированию, которые предоставляет C++. На конкретных примерах рассмотрим, как они могут упростить нам жизнь и с какими трудностями приходится сталкиваться при их использовании.
Для чтения не требуется почти никаких предварительных знаний, по крайней мере, ничего выходящего за рамки школьной программы. Исключение составляет только последний раздел.
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
В последнее время в промышленной разработке ПО особую популярность обретают Domain-Specific Lanugages (DSL). Они драматически упрощают разработку и дают возможность “программировать” не только программистам, но и пользователям прикладных программ.
В своем докладе я расскажу об опыте использования DSL применительно к С++, причем упор будет сделан на производительность кода DSL, и его мгновенную “встраиваемость” в запущенную программу путем компиляции DSL-кода в нативный код с помощью инструментария LLVM.
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
Флеш-накопители используются в самых разных устройствах, от мобильных телефонов до компьютеров и серверов. Для каждой модели накопителя нужна прошивка с определённым набором параметров, которые могут отличаться в зависимости от ситуации. В докладе будет описан универсальный фреймфорк на С++, который предоставляет разработчикам симуляторов простой, прозрачный и быстрый доступ к любому параметру. Тестировщикам же он позволяет управлять конфигурациями при помощи стандартных инструментов редактирования и слияния.
Как можно применить аспектно ориентированное программирование к шаблонам проектирования. Какие из них становится легче использовать? Какие полностью выносятся в шаблон и больше не являются частью вашей бизнес-логики.
Как создать более чистый код?
- на эти вопросы ответ в презентации.
Использование аспектов в реализации PostSharp к рефакторингу кода, к шаблонам банды четырех.
Большую часть инфраструктурного кода можно выделить и переиспользовать в других проектах.
Уменьшение влияния человеческого фактора при разработке бизнес приложенийngrebnev
В этом докладе мы постараемся рассказать о принципах разработки инструментов для написания бизнес-логики, позволяющих сократить количество ошибок. Речь пойдет о нескольких практиках, принятых в отделе технологического развития нашей компании. Принципы будут проиллюстрированы на примере инструментария компании для платформы Microsoft .NET.
Максимум статических проверок. Под статическими проверками мы понимаем проверки времени компиляции. Этот принцип является важным, но, к сожалению, зачастую недооценивается разработчиками инструментария разработки. Проверки времени компиляции могут отлавливать большой спектр ошибок. Есть и другая особенность – это удобство. Ошибки времени исполнения сложнее воспринимаются, труднее найти причину ошибки.
Разнообразие и декларативность проверок. Проверки общего назначения удобно задавать в декларативном виде. При этом сами проверки должен осуществлять фреймворк. За счет уменьшения дублирования и декларативности снижается вероятность ошибок. Проверки должны быть, как техническими, так и уровня доменной модели. Мы будем говорить о проверках уровня доменной модели.
Возможность анализа декларативных проверок. Любые ограничения порождают некоторую модель. Эту модель (проверки) можно формально верифицировать. Вообще, проблема доказательства большинства свойств программы невозможна. Этот вопрос выходит далеко за рамки нашего доклада. Но существует возможность верификации более слабых (менее выразительных моделей).
Во второй части мы обсудим функционал, который мы называем "состояния". Эти "состояния" образуют что-то вроде автомата, или структуру Крипке. Так вот, существуют алгоритмы проверки выполнимости темпоральных логик на таких структурах.
Точечная оценка. Определение
Пример 1
Свойства точечных оценок
Несмещенность
Пример 2
Состоятельность
Эффективность
Асимптотическая нормальность
Робастность
Описательная статистика, цели. Вариационный ряд
Полигон частот
Гистограмма
Гистограмма, пример. Выбор числа интервалов
Выборочные характеристики
Характеристики положения и рассеяния
Выборочные характеристики двумерной выборки
Основные задачи математической статистики. Примеры задач
Выборка.Выборочное пространство. Примеры
Простой случайный выбор. Реальные виды выборов
Функция распределения выборки
Эмпирическая вероятностная мера
Теорема Гливенко-Кантелли
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыDEVTYPE
Сколько есть способов разбить натуральное число в сумму нескольких слагаемых, если суммы, отличающиеся только порядком слагаемых, считаются одинаковыми? Оказывается, что на этот, казалось бы, элементарный вопрос нет простого ответа. Зато теория, начинающаяся с этого вопроса, оказывается очень интересной, а ее результаты находят применение в самых разных разделах математики и математической физики.
Настоящая брошюра написана по материалам лекций, прочитанных автором на летней школе «Современная математика» в Дубне в июле 2013 года. Она рассчитана на старшеклассников и студентов младших курсов.
Опечатки в слайдах на видео: в псевдокоде алгоритма решения непрерывной задачи о рюкзаке предметы должны сортироваться по убыванию (а не возрастанию) удельной стоимости.
- Определение чисел Фибоначчи, скорость роста
- Общая формула, экспоненциальная скорость роста
- Наивный алгоритм и анализ его времени работы
- Более быстрый алгоритм и анализ его времени работы, заключение
- Более детальный анализ алгоритма вычисления чисел Фибоначчи
- Определения O(⋅), преимущества и недостатки их использования для оценки времени работы алгоритмов
- Определения Ω(⋅),Θ(⋅),o(⋅), общие правила сравнения скорости роста стандартных функций
- Графики нескольких часто используемых функций
- Скорости часто используемых функций на практике, заключение
2. Глобальные переменные
Объявление глобальной переменной:
extern int global;
void f () {
++ global;
}
Определение глобальной переменной:
int global = 10;
Проблемы глобальных переменных:
∙ Масштабируемость.
∙ Побочные эффекты.
∙ Порядок инициализации.
2/9
3. Статические глобальные переменные
Статическая глобальная переменная — это глобальная
переменная, доступная только в пределах модуля.
Определение:
static int global = 10;
void f () {
++ global;
}
Проблемы статических глобальных переменных:
∙ Масштабируемость.
∙ Побочные эффекты.
3/9
4. Статические локальные переменные
Статическая локальная переменная — это глобальная
переменная, доступная только в пределах функции.
Время жизни такой переменной — от первого вызова функции
next до конца программы.
int next(int start = 0) {
static int k = start;
return k++;
}
Проблемы статических локальных переменных:
∙ Масштабируемость.
∙ Побочные эффекты.
4/9
5. Статические функции
Статическая функция, доступная только в пределах модуля.
Файл 1.cpp:
static void test () {
cout << "An";
}
Файл 2.cpp:
static void test () {
cout << "Bn";
}
Статические глобальные переменные и статические функции
проходят внутреннюю линковку.
5/9
6. Статические поля класса
Статические поля класса — это глобальные переменные,
определённые внутри класса.
Объявление:
struct User {
...
private:
static size_t instances_;
};
Определение:
size_t User :: instances_ = 0;
Для доступа к статическим полям не нужен объект.
6/9
7. Статические методы
Статические методы — это функции, определённые внутри
класса и имеющие доступ к закрытым полям и методам.
Объявление:
struct User {
...
static size_t count () { return instances_; }
private:
static size_t instances_;
};
Для вызова статических методов не нужен объект.
cout << User :: count ();
7/9
8. Ключевое слово inline
Советует компилятору встроить данную функцию.
inline double square(double x) { return x * x; }
∙ В месте вызова inline-функции должно быть известно её
определение.
∙ inline функции можно определять в заголовочных
файлах.
∙ Все методы, определённые внутри класса, являются
inline.
∙ При линковке из всех версий inline-функции (т.е. её код
из разных единиц трансляции) выбирается только одна.
∙ Все определения одной и той же inline-функции должны
быть идентичными.
∙ inline — это совет компилятору, а не указ. 8/9
9. Правило одного определения
Правило одного определения
(One Definition Rule, ODR)
∙ В пределах любой единицы трансляции сущности не могут
иметь более одного определения.
∙ В пределах программы глобальные переменные и
не-inline функции не могут иметь больше одного
определения.
∙ Классы и inline функции могут определяться в более чем
одной единице трансляции, но определения обязаны
совпадать.
Вопрос: к каким проблемам могут привести разные
определения одного класса в разных частях программы?
9/9