SlideShare ist ein Scribd-Unternehmen logo
1 von 27
Жив ли Си++?
Прошлое, настоящее, будущее.

Карпов Андрей Николаевич
к.ф.-м.н., MVP (Visual C++),
технический директор
ООО «СиПроВер»
Сайт: www.viva64.com
E-Mail: karpov@viva64.com
Умер ли Си/Си++?
Нет. Он одна из важных
      технологий.

Просто технологий стало
        больше!
• Кода на Си/Си++ в старых и новых системах
  не стало меньше.
• Выросло количество разрабатываемых
  систем, где рационально использовать
  другие языки (web, мобильные телефоны,
  клиентские программы).
• Аналогия с бумагой. Кажется,
  компьютерные технологии повсеместно
  могут заменить бумагу.
Говорить «стало меньше Си++» как
      говорить «меньше стала
      использоваться бумага»
• Государственные учреждения. Куда ставить
  печать и подпись?
• Надежность (архивы, военное дело).
• Бумажные книги не исчезли.
• Комиксы, раскраски для детей, оригами.
• Как поможет iPhone в туалете?
Закрывать бумажную фабрику
         смысла нет.

А стоит ли продолжать заниматься
             Си/Си++?

    Да. Это приносит деньги.

Поговорим, почему это приносит
           деньги.
Почему язык Си/Си++ ещё очень
        долго будет популярен
• Инерция;
• Ресурсоемкие вычисления;
• Экономия энергии;
• Ограничения встраиваемых и мобильных
  систем;
• Новые языки приходят и уходят, а Си/Си++
  остаётся.
Инерция
• Существуют такие продукты, как «CHARON-
  PDP11 for Windows» для поддержки PDP11.
  Компания Stromasys - www.stromasys.ch

• Неудача Intel c 64-битной архитектурой
  Itanium.

• Огромное количество
  БОЛЬШИХ библиотек.
  Пример: библиотека ACIS.
Ресурсоемкие вычисления
• Активно используется Фортран. Си/Си++
  рассматриваются для таких задач в
  перспективе. Intel активно работает над
  включением матриц в стандарт языка Си++.
• Си/Си++ позволяют максимально полно
  использовать доступную память.
• Си самый быстрый (после Фортрана). Не
  верьте рекламным измерениям скорости.
Экономия энергии
• Макро. Для датацентра с
  тысячами обращений в
  секунду важно, работает
  алгоритм 100 или 150
  микросекунд.

• Микро. Важно для
  встраиваемых
  систем, работающих долгое
  время.
Ограничения встраиваемых и
         мобильных систем
• Нужно работать быстро, чтобы уменьшить
  потребление энергии.
• Ограничения объема памяти.
• Новое направление – робототехника на
  дому.
• Лучше потратить деньги на оптимизацию
  ПО, чем увеличить стоимость аппаратной
  части миллионов устройств.
Новые языки приходят и уходят, а
           Си/Си++ остаётся
    C++ Applications: http://www.stroustrup.com/applications.html

•   Adobe Systems: Photoshop, Acrobat, Illustrator, ...
•   Apple: OS X (разные языки, но в основном Си++)
•   Autodesk: различные CAD системы
•   CERN: Data analysis
•   Facebook: Several high-performance and high-
    reliability components.
•   Google: Chromium, MapReduce, Google file system.
•   Microsoft: Windows, Microsoft Office, ...
•   Mozilla: Firefox, Thunderbird
•   ...
Си/Си++ не только жив, но и
  постоянно развивается
О новом в языке
(будем говорить только про Си++)
Делегирующие конструкторы
class File
{
public:
  File(char const * filename, char const * mode)
      : file_(fopen(filename, mode))
  {
  }

 ~File()
 {
   fclose(file_);
 }

Теперь нам хочется сделать что-то сложное в
конструкторе, что может бросить исключение.
Делегирующие конструкторы
class File
{
  File(FILE * file) : file_(file)
  {}

public:
  File(char const * filename, char const * mode)
      : File(fopen(filename, mode))
  {
    Foo();
  }

Другое применение –
можно избавиться от функции Init().
Диапазонный for, auto, списки
           инициализации
auto x = A * B;


std::vector<string> string_array = { "aa", "bb" };

for (auto s : string_array)
{
  cout << s << endl;
}


for (const auto x : { 1,2,3,5,8,13,21,34 })
  cout << x << 'n';
Управление поведением по
        умолчанию: default и delete
Сейчас стандартная идиома «запрета копирования» может быть
явно выражена следующим образом:

class X {
  …
  X& operator=(const X&) = delete;
  X(const X&) = delete;


И наоборот, мы можем явно сказать о том, что хотим
использовать поведение копирования по умолчанию:

class Y {
  …
  Y& operator=(const Y&) = default;
  Y(const Y&) = default;
enum class – строго типизированные
            перечисления
Объявления “enum class Color { red, blue };”
решают проблемы:
• Стандартные перечисления (enums) могут
  неявно преобразовываться к int.
• Стандартные перечисления экспортируют свои
  значения в окружающую область видимости,
  что приводит к коллизиям имен.
• Невозможно указать тип, лежащий в основе
  стандартных перечислений.
сonstexpr – обобщенные гарантировано
       константные выражения

  constexpr int Foo(int a, int b)
  {
    constexpr int tmp = a + 10;
    return tmp | b;
  }


  int x = Foo(1, 2);
decltype – тип выражения

void f(const vector<int>& a, vector<float>& b)
{
      typedef decltype(a[0]*b[0]) Tmp;
      for (int i=0; i<b.size(); ++i) {
             Tmp* p = new Tmp(a[i]*b[i]);
             // ...
      }
      // ...
}
Инициализация членов класса при
          объявлении
class A {
public:
      int a = 7;
};


Эквивалентно:

class A {
public:
      int a;
      A() : a(7) {}
};
Статические утверждения
static_assert(
  sizeof(long)>=8,
  "64-bit code generation required for this library."
);
nullptr - литерал для задания
     нулевого указателя
            void f(int);
            void f(char*);

            f(0);      // вызов f(int)

            f(nullptr); // вызов f(char*)
Шаблоны с переменным числом
           параметров
template<typename T, typename... Args>
void printf(const char* s, T value, Args... args)
{
  while (s && *s) {
    if (*s=='%' && *++s!='%') {
      std::cout << value;
      return printf(++s, args...);
    }
    std::cout << *s++;
  }
}
Лямбда-выражения
std::sort(v.begin(), v.end(),
          [](int a, int b) { return abs(a)<abs(b); });

vector<int> myList;
int total = 0;
for_each(myList.begin(), myList.end(), [&total](int x)
{
  total += x;
});
std::cout << total;

auto myFunc = [this]() { this->PrivateMemberFunc (); };
Другое
•   Rvalue ссылки &&
•   Пользовательские литералы
•   Атрибуты **…++
•   Класс array: array<int,6> a = { 1, 2, 3 };
•   …
Дополнительные ссылки
• C++ 11 FAQ от Бьярна Страуструпа (перевод)
  http://sergeyteplyakov.blogspot.com/2012/05
  /c-11-faq.html

• «Универсальные» ссылки в C++11 или T&&
  не всегда означает «Rvalue Reference»
  http://habrahabr.ru/post/157961/

Weitere ähnliche Inhalte

Was ist angesagt?

Лекция 10: Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 10: Деревья разбиения пространства (BSP tree, k-d tree, quadtree)Лекция 10: Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 10: Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Mikhail Kurnosov
 
Программирование. Лекция 3
Программирование. Лекция 3Программирование. Лекция 3
Программирование. Лекция 3
Andrei V, Zhuravlev
 
презентация лекции №10
презентация лекции №10презентация лекции №10
презентация лекции №10
student_kai
 

Was ist angesagt? (20)

Functional Programing
Functional ProgramingFunctional Programing
Functional Programing
 
Представление информации в компьютере
Представление информации в компьютереПредставление информации в компьютере
Представление информации в компьютере
 
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
 
Лекция 10: Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 10: Деревья разбиения пространства (BSP tree, k-d tree, quadtree)Лекция 10: Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 10: Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
 
S2 boolean amp-amp_complex_gates
S2 boolean amp-amp_complex_gatesS2 boolean amp-amp_complex_gates
S2 boolean amp-amp_complex_gates
 
6.2 Шаблоны функций
6.2 Шаблоны функций6.2 Шаблоны функций
6.2 Шаблоны функций
 
ОПК № 2 – Алгоритмы и структуры данных, язык C
ОПК № 2 – Алгоритмы и структуры данных, язык CОПК № 2 – Алгоритмы и структуры данных, язык C
ОПК № 2 – Алгоритмы и структуры данных, язык C
 
Программирование. Лекция 3
Программирование. Лекция 3Программирование. Лекция 3
Программирование. Лекция 3
 
Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.Haskell Type System with Dzmitry Ivashnev.
Haskell Type System with Dzmitry Ivashnev.
 
4.3 Виртуальные методы
4.3 Виртуальные методы4.3 Виртуальные методы
4.3 Виртуальные методы
 
S3 karnaugh maps-full
S3 karnaugh maps-fullS3 karnaugh maps-full
S3 karnaugh maps-full
 
4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов
 
презентация лекции №10
презентация лекции №10презентация лекции №10
презентация лекции №10
 
Scala #3
Scala #3Scala #3
Scala #3
 
Обработка текста на Haskell - это просто!
Обработка текста на Haskell - это просто!Обработка текста на Haskell - это просто!
Обработка текста на Haskell - это просто!
 
Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).
 
S3 karnaugh maps-short
S3 karnaugh maps-shortS3 karnaugh maps-short
S3 karnaugh maps-short
 
алфавит
алфавиталфавит
алфавит
 
Системы счисления
Системы счисленияСистемы счисления
Системы счисления
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметика
 

Andere mochten auch

РАЗРАБОТКА МОБИЛЬНЫХ САЙТОВ
РАЗРАБОТКА МОБИЛЬНЫХ САЙТОВРАЗРАБОТКА МОБИЛЬНЫХ САЙТОВ
РАЗРАБОТКА МОБИЛЬНЫХ САЙТОВ
Pavel Tsukanov
 
Sql azure federations
Sql azure federations Sql azure federations
Sql azure federations
Pavel Tsukanov
 

Andere mochten auch (20)

РАЗРАБОТКА МОБИЛЬНЫХ САЙТОВ
РАЗРАБОТКА МОБИЛЬНЫХ САЙТОВРАЗРАБОТКА МОБИЛЬНЫХ САЙТОВ
РАЗРАБОТКА МОБИЛЬНЫХ САЙТОВ
 
РАЗРАБОТКА ПО С ИСПОЛЬЗОВАНИЕМ FINITE STATE MACHINE.
РАЗРАБОТКА ПО С ИСПОЛЬЗОВАНИЕМ FINITE STATE MACHINE.РАЗРАБОТКА ПО С ИСПОЛЬЗОВАНИЕМ FINITE STATE MACHINE.
РАЗРАБОТКА ПО С ИСПОЛЬЗОВАНИЕМ FINITE STATE MACHINE.
 
ЭЛЕМЕНТЫ ИСКУСТВЕННОГО ИНТЕЛЛЕКТА ПРИ ПРОГРАММИРОВАНИИ. (http://tuladev.net/e...
ЭЛЕМЕНТЫ ИСКУСТВЕННОГО ИНТЕЛЛЕКТА ПРИ ПРОГРАММИРОВАНИИ. (http://tuladev.net/e...ЭЛЕМЕНТЫ ИСКУСТВЕННОГО ИНТЕЛЛЕКТА ПРИ ПРОГРАММИРОВАНИИ. (http://tuladev.net/e...
ЭЛЕМЕНТЫ ИСКУСТВЕННОГО ИНТЕЛЛЕКТА ПРИ ПРОГРАММИРОВАНИИ. (http://tuladev.net/e...
 
Алгоритмы шифрования и их применение в .Net приложениях для защиты данных.
Алгоритмы шифрования и их применение в .Net приложениях для защиты данных.Алгоритмы шифрования и их применение в .Net приложениях для защиты данных.
Алгоритмы шифрования и их применение в .Net приложениях для защиты данных.
 
Sql azure federations
Sql azure federations Sql azure federations
Sql azure federations
 
RESPONSIVE WEB DESIGN
RESPONSIVE WEB DESIGNRESPONSIVE WEB DESIGN
RESPONSIVE WEB DESIGN
 
Основы "мобильной" разработки на примере платформы iOs (iPhone)
Основы "мобильной" разработки на примере платформы iOs (iPhone)Основы "мобильной" разработки на примере платформы iOs (iPhone)
Основы "мобильной" разработки на примере платформы iOs (iPhone)
 
Thinking in parallel ab tuladev
Thinking in parallel ab tuladevThinking in parallel ab tuladev
Thinking in parallel ab tuladev
 
SIGNALR - ОБМЕН СООБЩЕНИЯМИ В РЕАЛЬНОМ ВРЕМЕНИ
SIGNALR - ОБМЕН СООБЩЕНИЯМИ В РЕАЛЬНОМ ВРЕМЕНИSIGNALR - ОБМЕН СООБЩЕНИЯМИ В РЕАЛЬНОМ ВРЕМЕНИ
SIGNALR - ОБМЕН СООБЩЕНИЯМИ В РЕАЛЬНОМ ВРЕМЕНИ
 
KNOCKOUTJS КАК РЕАЛИЗАЦИЯ MVVM
KNOCKOUTJS КАК РЕАЛИЗАЦИЯ MVVMKNOCKOUTJS КАК РЕАЛИЗАЦИЯ MVVM
KNOCKOUTJS КАК РЕАЛИЗАЦИЯ MVVM
 
Введение в Knockout
Введение в Knockout Введение в Knockout
Введение в Knockout
 
Unit tests
Unit testsUnit tests
Unit tests
 
Domain-Driven Design: Модель вместо требований
Domain-Driven Design: Модель вместо требованийDomain-Driven Design: Модель вместо требований
Domain-Driven Design: Модель вместо требований
 
TDD (Test-driven Development) как стиль разработки.
TDD (Test-driven Development) как стиль разработки.TDD (Test-driven Development) как стиль разработки.
TDD (Test-driven Development) как стиль разработки.
 
PaaS и SaaS
PaaS и SaaSPaaS и SaaS
PaaS и SaaS
 
Автоматизированное тестирование UI на C# + Selenium WebDriver
Автоматизированное тестирование UI на C# + Selenium WebDriverАвтоматизированное тестирование UI на C# + Selenium WebDriver
Автоматизированное тестирование UI на C# + Selenium WebDriver
 
Реализация REST и SOAP сервисов с помощью WCF
Реализация REST и SOAP сервисов с помощью WCFРеализация REST и SOAP сервисов с помощью WCF
Реализация REST и SOAP сервисов с помощью WCF
 
Лекция Android
Лекция AndroidЛекция Android
Лекция Android
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?
 

Ähnlich wie СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++

Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Dima Dzuba
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 
ADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кода
Andrey Karpov
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2
Technopark
 

Ähnlich wie СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++ (20)

Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
Step cpp0201
Step cpp0201Step cpp0201
Step cpp0201
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
C language. Introduction
C language. IntroductionC language. Introduction
C language. Introduction
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 
About Python
About PythonAbout Python
About Python
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кода
 
ADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кода
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 
Большой брат помогает тебе
Большой брат помогает тебеБольшой брат помогает тебе
Большой брат помогает тебе
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Эффективный C++
Эффективный C++Эффективный C++
Эффективный C++
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
 
Урок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаУрок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметика
 

Mehr von Pavel Tsukanov

Mehr von Pavel Tsukanov (11)

МАШИННОЕ ЗРЕНИЕ С ИСПОЛЬЗОВАНИЕ OPENCV
МАШИННОЕ ЗРЕНИЕ С ИСПОЛЬЗОВАНИЕ OPENCVМАШИННОЕ ЗРЕНИЕ С ИСПОЛЬЗОВАНИЕ OPENCV
МАШИННОЕ ЗРЕНИЕ С ИСПОЛЬЗОВАНИЕ OPENCV
 
CONTINUOUS INTEGRATION ДЛЯ ЧАЙНИКОВ ВМЕСТЕ С TEAMCITY
CONTINUOUS INTEGRATION ДЛЯ ЧАЙНИКОВ ВМЕСТЕ С TEAMCITYCONTINUOUS INTEGRATION ДЛЯ ЧАЙНИКОВ ВМЕСТЕ С TEAMCITY
CONTINUOUS INTEGRATION ДЛЯ ЧАЙНИКОВ ВМЕСТЕ С TEAMCITY
 
СОЗДАЙ РОБОТА С НУЛЯ
СОЗДАЙ РОБОТА С НУЛЯСОЗДАЙ РОБОТА С НУЛЯ
СОЗДАЙ РОБОТА С НУЛЯ
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS
 
АНИМАЦИЯ В FLASH И HTML5
АНИМАЦИЯ В FLASH И HTML5АНИМАЦИЯ В FLASH И HTML5
АНИМАЦИЯ В FLASH И HTML5
 
ХАКЕРЫ И АНТИХАКЕРЫ
ХАКЕРЫ И АНТИХАКЕРЫХАКЕРЫ И АНТИХАКЕРЫ
ХАКЕРЫ И АНТИХАКЕРЫ
 
ЗАРАБОТОК В ИНТЕРНЕТЕ.
ЗАРАБОТОК В ИНТЕРНЕТЕ.ЗАРАБОТОК В ИНТЕРНЕТЕ.
ЗАРАБОТОК В ИНТЕРНЕТЕ.
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
 
Как писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDКак писать красивый код или основы SOLID
Как писать красивый код или основы SOLID
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Применение нейронных сетей и генетических алгоритмов при торговле на бирже.
Применение нейронных сетей и генетических алгоритмов при торговле на бирже. Применение нейронных сетей и генетических алгоритмов при торговле на бирже.
Применение нейронных сетей и генетических алгоритмов при торговле на бирже.
 

СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++

  • 1. Жив ли Си++? Прошлое, настоящее, будущее. Карпов Андрей Николаевич к.ф.-м.н., MVP (Visual C++), технический директор ООО «СиПроВер» Сайт: www.viva64.com E-Mail: karpov@viva64.com
  • 2. Умер ли Си/Си++? Нет. Он одна из важных технологий. Просто технологий стало больше!
  • 3. • Кода на Си/Си++ в старых и новых системах не стало меньше. • Выросло количество разрабатываемых систем, где рационально использовать другие языки (web, мобильные телефоны, клиентские программы). • Аналогия с бумагой. Кажется, компьютерные технологии повсеместно могут заменить бумагу.
  • 4. Говорить «стало меньше Си++» как говорить «меньше стала использоваться бумага» • Государственные учреждения. Куда ставить печать и подпись? • Надежность (архивы, военное дело). • Бумажные книги не исчезли. • Комиксы, раскраски для детей, оригами. • Как поможет iPhone в туалете?
  • 5. Закрывать бумажную фабрику смысла нет. А стоит ли продолжать заниматься Си/Си++? Да. Это приносит деньги. Поговорим, почему это приносит деньги.
  • 6. Почему язык Си/Си++ ещё очень долго будет популярен • Инерция; • Ресурсоемкие вычисления; • Экономия энергии; • Ограничения встраиваемых и мобильных систем; • Новые языки приходят и уходят, а Си/Си++ остаётся.
  • 7. Инерция • Существуют такие продукты, как «CHARON- PDP11 for Windows» для поддержки PDP11. Компания Stromasys - www.stromasys.ch • Неудача Intel c 64-битной архитектурой Itanium. • Огромное количество БОЛЬШИХ библиотек. Пример: библиотека ACIS.
  • 8. Ресурсоемкие вычисления • Активно используется Фортран. Си/Си++ рассматриваются для таких задач в перспективе. Intel активно работает над включением матриц в стандарт языка Си++. • Си/Си++ позволяют максимально полно использовать доступную память. • Си самый быстрый (после Фортрана). Не верьте рекламным измерениям скорости.
  • 9. Экономия энергии • Макро. Для датацентра с тысячами обращений в секунду важно, работает алгоритм 100 или 150 микросекунд. • Микро. Важно для встраиваемых систем, работающих долгое время.
  • 10. Ограничения встраиваемых и мобильных систем • Нужно работать быстро, чтобы уменьшить потребление энергии. • Ограничения объема памяти. • Новое направление – робототехника на дому. • Лучше потратить деньги на оптимизацию ПО, чем увеличить стоимость аппаратной части миллионов устройств.
  • 11. Новые языки приходят и уходят, а Си/Си++ остаётся C++ Applications: http://www.stroustrup.com/applications.html • Adobe Systems: Photoshop, Acrobat, Illustrator, ... • Apple: OS X (разные языки, но в основном Си++) • Autodesk: различные CAD системы • CERN: Data analysis • Facebook: Several high-performance and high- reliability components. • Google: Chromium, MapReduce, Google file system. • Microsoft: Windows, Microsoft Office, ... • Mozilla: Firefox, Thunderbird • ...
  • 12. Си/Си++ не только жив, но и постоянно развивается
  • 13. О новом в языке (будем говорить только про Си++)
  • 14. Делегирующие конструкторы class File { public: File(char const * filename, char const * mode) : file_(fopen(filename, mode)) { } ~File() { fclose(file_); } Теперь нам хочется сделать что-то сложное в конструкторе, что может бросить исключение.
  • 15. Делегирующие конструкторы class File { File(FILE * file) : file_(file) {} public: File(char const * filename, char const * mode) : File(fopen(filename, mode)) { Foo(); } Другое применение – можно избавиться от функции Init().
  • 16. Диапазонный for, auto, списки инициализации auto x = A * B; std::vector<string> string_array = { "aa", "bb" }; for (auto s : string_array) { cout << s << endl; } for (const auto x : { 1,2,3,5,8,13,21,34 }) cout << x << 'n';
  • 17. Управление поведением по умолчанию: default и delete Сейчас стандартная идиома «запрета копирования» может быть явно выражена следующим образом: class X { … X& operator=(const X&) = delete; X(const X&) = delete; И наоборот, мы можем явно сказать о том, что хотим использовать поведение копирования по умолчанию: class Y { … Y& operator=(const Y&) = default; Y(const Y&) = default;
  • 18. enum class – строго типизированные перечисления Объявления “enum class Color { red, blue };” решают проблемы: • Стандартные перечисления (enums) могут неявно преобразовываться к int. • Стандартные перечисления экспортируют свои значения в окружающую область видимости, что приводит к коллизиям имен. • Невозможно указать тип, лежащий в основе стандартных перечислений.
  • 19. сonstexpr – обобщенные гарантировано константные выражения constexpr int Foo(int a, int b) { constexpr int tmp = a + 10; return tmp | b; } int x = Foo(1, 2);
  • 20. decltype – тип выражения void f(const vector<int>& a, vector<float>& b) { typedef decltype(a[0]*b[0]) Tmp; for (int i=0; i<b.size(); ++i) { Tmp* p = new Tmp(a[i]*b[i]); // ... } // ... }
  • 21. Инициализация членов класса при объявлении class A { public: int a = 7; }; Эквивалентно: class A { public: int a; A() : a(7) {} };
  • 22. Статические утверждения static_assert( sizeof(long)>=8, "64-bit code generation required for this library." );
  • 23. nullptr - литерал для задания нулевого указателя void f(int); void f(char*); f(0); // вызов f(int) f(nullptr); // вызов f(char*)
  • 24. Шаблоны с переменным числом параметров template<typename T, typename... Args> void printf(const char* s, T value, Args... args) { while (s && *s) { if (*s=='%' && *++s!='%') { std::cout << value; return printf(++s, args...); } std::cout << *s++; } }
  • 25. Лямбда-выражения std::sort(v.begin(), v.end(), [](int a, int b) { return abs(a)<abs(b); }); vector<int> myList; int total = 0; for_each(myList.begin(), myList.end(), [&total](int x) { total += x; }); std::cout << total; auto myFunc = [this]() { this->PrivateMemberFunc (); };
  • 26. Другое • Rvalue ссылки && • Пользовательские литералы • Атрибуты **…++ • Класс array: array<int,6> a = { 1, 2, 3 }; • …
  • 27. Дополнительные ссылки • C++ 11 FAQ от Бьярна Страуструпа (перевод) http://sergeyteplyakov.blogspot.com/2012/05 /c-11-faq.html • «Универсальные» ссылки в C++11 или T&& не всегда означает «Rvalue Reference» http://habrahabr.ru/post/157961/