Некоторые особенности нового стандарта C++                Вомпе Федор
Структура изложения●   Немного из истории●   Особенности нового стандарта
История стандарта C++●   C++98    ISO/IEC 14882:1998, первая версия стандарта от комитета    JTC1/SC22/WG21, сам язык появ...
C++0xРассматриваются предложения(Proposals) поизмененению стандарта до 2006 годаОсновные стадии работы над стандартом :  ●...
Что такое C++0x?●   C++0x – следующая версия стандарта C++●   “x” в названии – год утверждения стандарта,    рассчитывали ...
Что говорят o С++0x?●   “C++0x feels like a new language” - Bjarne Stroustrup, C++0x    FAQ●   “C++0x offers much more tha...
Поддержка компиляторов●   GCC 4.5.* (флаг -std=c++0x)●   MSVC 10.0●   IBM XLC/C++●   Intel C++ Compiler 11.0              ...
Семантика перемещенияС++ построен на семантике копирования – ни компилятор, ниразработчик не отслеживают временные объекты...
lvalueslvalue – “левая часть” выражений, определяет объект сдлительным временем жизниОбычно можно получить как адрес так и...
rvaluesrvalue – временные объекты, которые обычно живут до концавыраженияНельзя получить адрес rvalue переменной   10   i ...
С++0x: rvalue referencesПредложены ~2002 году (N1385=02-0043)Введение ссылок на временные объекты (rvaluereferences), испо...
Семантика копирования vs Семантика перемещенияБенчмарк: один и тот же код работы STL с поддержкой C++0x(rvalue references ...
Что же лучше?              30              25              20время, сек.              15              10               5  ...
Неявное определение move-конструкцийИз “правила трёх” (Rule of Three) вырисовывается “правилоПяти” (Rule of Five). Так или...
Пример: нарушение инвариантов#define _GLIBCXX_DEBUG#include <iostream>#include <vector>struct X{    // invariant: v.size()...
Анализ и решениеНеявное задание move-конструкций нарушает инварианты =>C++98/C++03 код несовместим со стандартом C++0x●   ...
Лямбда-выраженияЛямбда-исчисление – фактически наука   see for ex: John Harrisons “Introduction to Functional Programming ...
Пример функционального объектаclass OddFunctor{public:   OddFunctor(int& evenCount) : _evenCount(evenCount) { }   void ope...
И его использованиеint main(){   vector<int> v;   for (int i = 0; i < 10; ++i)   {      v.push_back(i);   }    int evenCou...
Тот же код с лямбдамиint main(){   vector<int> v;   for (int i = 0; i < 10; ++i)   {      v.push_back(i);   }    int evenC...
Структура лямбда-выражения[<список захвата>](<список параметров>) //опционально -> скобки можно не ставитьmutable throw(<с...
Примеры лямбда выраженийЧисла Фиббоначи 1 :vector<int> v;v.resize(20);generate(v.begin(), v.end(), [] {    static int firs...
Примеры лямбда выраженийЧисла Фиббоначи 2 – рекурсивные лямбда-выраженияvector<int> v;v.resize(20);function<int(int)> fib2...
Да, это тоже лямбда      [](){}();   // я тоже ∃
Ключевое слово autoС++98 - ничего не делалоC++0x(N1984=06-0054) – определение типа по выражению :    auto a = 7; // int   ...
Delegating Constructors            (делегирование конструкторов)Делегирование конструкторов способ использования уженаписа...
Списки инициализации(Initializer Lists)Initializer Lists(N2672=08-0182) – возможность создания и инициализации объектапри ...
Inheriting constructors         (наследование конструкторов)Что, если дочерним классам разрешить использовать конструкторы...
“Why doesn’t C++ have garbage collection? ……  Because then there would be nothing left.”
Литература●   JTC1/SC22/WG21 - The C++ Standards Committee    http://www.open-std.org/jtc1/sc22/wg21/●   Visual C++ Team B...
Bonus section
Raw and Unicode String LiteralsProposal : N2442, gcc 4.5/4.4Unicode – добавление типов char16_t и char32_t, гарантированра...
Fixed-Size Integer TypesТипы фиксированного размера – взяты из TR1 (ns std::tr1)●   int8_t, int16_t int32_t, int64_t●   in...
Its nulltptr!Как вызвать func(char* ) для следующего кода?   void func(int);   void func(char *);   int main()   {      fu...
Использование nullptrchar* ch = nullptr;      //   ch со значением nullptrchar* ch2 = 0;           //   ch2 со значением n...
Cpp0x Introduction
Cpp0x Introduction
Cpp0x Introduction
Cpp0x Introduction
Upcoming SlideShare
Loading in …5
×

Cpp0x Introduction

1,617 views

Published on

Некоторые особенности нового стандарта C++

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,617
On SlideShare
0
From Embeds
0
Number of Embeds
341
Actions
Shares
0
Downloads
8
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Cpp0x Introduction

  1. 1. Некоторые особенности нового стандарта C++ Вомпе Федор
  2. 2. Структура изложения● Немного из истории● Особенности нового стандарта
  3. 3. История стандарта C++● C++98 ISO/IEC 14882:1998, первая версия стандарта от комитета JTC1/SC22/WG21, сам язык появился ~ 1983● C++2003 ISO/IEC 14882:2003, скорректированная версия C++98● C++TR1 (2005) ISO/IEC TR 19768, C++ Library Extensions● C++0x (2011) ISO/IEC 14882:2011, первая крупная ревизия стандарта, добавление новых возможностей● C++TR2 (20??)
  4. 4. C++0xРассматриваются предложения(Proposals) поизмененению стандарта до 2006 годаОсновные стадии работы над стандартом : ● CD(Committee Draft) ● FCD(Final Committee Draft) March 2010, Pittsburgh ● FDIS(Final Draft International Standard) March 2011, Madrid ● IS(International Standard) ?== FDIS ??, утверждение стандарта ISO, может занять около года
  5. 5. Что такое C++0x?● C++0x – следующая версия стандарта C++● “x” в названии – год утверждения стандарта, рассчитывали принять в 2008/2009 году. Теперь - “х” - шестнадцатиричное число (C++0B стандарт? )
  6. 6. Что говорят o С++0x?● “C++0x feels like a new language” - Bjarne Stroustrup, C++0x FAQ● “C++0x offers much more than “old” C++” - Scott Meyers, www.aristeia.com
  7. 7. Поддержка компиляторов● GCC 4.5.* (флаг -std=c++0x)● MSVC 10.0● IBM XLC/C++● Intel C++ Compiler 11.0 http://wiki.apache.org/stdcxx/C++0xCompilerSupport http://www.aristeia.com/C++0x/C++0xFeatureAvailability.htm
  8. 8. Семантика перемещенияС++ построен на семантике копирования – ни компилятор, ниразработчик не отслеживают временные объекты #include <iostream> #include <string> using namespace std; int main() { string s = string("h") + "e" + "ll" + "o"; cout << s << endl; }С++98/С++2003 – каждая операция сложения – создание новойстроки. C++0x - “добавление” строки к временной строке=> Необходимость определения и задания lvalue и rvalue значений
  9. 9. lvalueslvalue – “левая часть” выражений, определяет объект сдлительным временем жизниОбычно можно получить как адрес так и значение переменной char a [10]; i; ++i; *&i; a[5]; a[i];Время жизни объекта контролируется разработчиком
  10. 10. rvaluesrvalue – временные объекты, которые обычно живут до концавыраженияНельзя получить адрес rvalue переменной 10 i + 1 i++Время жизни объекта контролируется компилятором
  11. 11. С++0x: rvalue referencesПредложены ~2002 году (N1385=02-0043)Введение ссылок на временные объекты (rvaluereferences), использование && для типаСогласование с C++: ● lvalue ссылка T& => изменяемые lvalue ● lvalue ссылка T const& (i.e., const T&) => всевозможные modifiable/const lvalues and rvalues ● rvalue ссылка T&& => только изменяемые rvalue (Не лишайте прав невременных объектов ;) ) ● rvalue ссылка T const&& (i.e., const T&&) => modifiable/ const rvalues;
  12. 12. Семантика копирования vs Семантика перемещенияБенчмарк: один и тот же код работы STL с поддержкой C++0x(rvalue references && move semantics) и без егоподдержки, компилятор GCC 4.5.1C:codecpp>move_n.exeN = 3001construction took 5.536sort took 0.012rotate took 0.001destruction took 1.024doneTotal time = 6.573C:codecpp>move_o.exeN = 3001construction took 16.899sort took 11.254rotate took 0.002destruction took 1.254doneTotal time = 29.409http://cpp-next.com/archive/2010/10/howards-stl-move-semantics-benchmark/
  13. 13. Что же лучше? 30 25 20время, сек. 15 10 5 0 construction sort rotate destruction Total time операции Move-enabled raw gcc
  14. 14. Неявное определение move-конструкцийИз “правила трёх” (Rule of Three) вырисовывается “правилоПяти” (Rule of Five). Так или иначе должны быть определены : ● Деструктор ● Copy-конструктор ● Copy-operator присаивания ● Move-конструктор ● Move-operator присваиванияПроблема: Как неявно доопределять недостающие конструкции?
  15. 15. Пример: нарушение инвариантов#define _GLIBCXX_DEBUG#include <iostream>#include <vector>struct X{ // invariant: v.size() == 5 X() : v(5) {} //This move-constructor implicitly generated by compiler X(X&& r) { v = std::move(r.v); } ~X() { std::cout << v[0] << std::endl; //доступ к элементу которого уже нет ;( } private: std::vector<int> v;};int main(){ std::vector<X> y; y.push_back(X()); // X() rvalue: copied in C++03, moved in C++0x}
  16. 16. Анализ и решениеНеявное задание move-конструкций нарушает инварианты =>C++98/C++03 код несовместим со стандартом C++0x● Самое простое решение – отказаться от неявной генерации move-конструкций, оставить их явное задание (Dave Abrahams, “Implicit Move Must Go”, N3153=10-0143)● Другое решение – генерировать move-конструкции при определенных условиях => ограничение на содержание в классе rvalues/const/reference значений (видимо, к этому решению склоняется комитет) В нашем случае – запрещаем генерировать move-конструктор т.к. есть деструктор, определенный пользователем(подробнее - n3203)● Еще решение – сделать C++0x несовместим с C++98/03 (совсем не вариант, нет совместимости)
  17. 17. Лямбда-выраженияЛямбда-исчисление – фактически наука see for ex: John Harrisons “Introduction to Functional Programming course”, http://code.google.com/p/funprog-ru/В программировании - вид записи анонимных(безымянных) функций (в C++- функторов) ● Обычно определяются в месте своего использования ● В C++ представляют из себя короткую запись для функциональных объектов ● Востребованы в многопоточных приложенияхУже давно есть и успешно применяются в функциональных языках(ML,Lisp, Erlang, ...) и в main-stream языках(python, php!, js). В Java – их нет.“Lambdas, Lambdas Everywhere” - Herb Sutter on PDC 2010
  18. 18. Пример функционального объектаclass OddFunctor{public: OddFunctor(int& evenCount) : _evenCount(evenCount) { } void operator()(int n) { if (n % 2 == 0) { _evenCount++; cout << n; } }private: int& _evenCount;};
  19. 19. И его использованиеint main(){ vector<int> v; for (int i = 0; i < 10; ++i) { v.push_back(i); } int evenCount = 0; for_each(v.begin(), v.end(), OddFunctor(evenCount)); cout << "There are " << evenCount << " even numbers in the vector." << endl;}
  20. 20. Тот же код с лямбдамиint main(){ vector<int> v; for (int i = 0; i < 10; ++i) { v.push_back(i); } int evenCount = 0; for_each(v.begin(), v.end(), [&evenCount] (int n) { if (n % 2 == 0) { evenCount++; cout << n << endl; } }); cout << "There are " << evenCount << " even numbers in the vector." << endl;}
  21. 21. Структура лямбда-выражения[<список захвата>](<список параметров>) //опционально -> скобки можно не ставитьmutable throw(<список исключений>) //опционально-> <тип возвращаемого значение> //опционально, вместе со стрелкой{<тело лямбды>}Список захвата : ● &<имя переменной> - захват переменной по ссылке (=> замыкания) ● <имя переменной> - захват переменной по значению ● & - захват всех переменных по ссылке ● = - захват всех переменных по значениюСписок параметров – как у функции, перечисление <тип> <имя_параметра>“mutable” – указывает на то, надо ли разрешать изменять переменные, захваченныепо значению
  22. 22. Примеры лямбда выраженийЧисла Фиббоначи 1 :vector<int> v;v.resize(20);generate(v.begin(), v.end(), [] { static int first = 0; static int second = 1; int ret = first; int new_second = first + second; first = second; second = new_second; return ret; });for_each(v.begin(), v.end(), [] (int n) { cout << n << endl; });
  23. 23. Примеры лямбда выраженийЧисла Фиббоначи 2 – рекурсивные лямбда-выраженияvector<int> v;v.resize(20);function<int(int)> fib2 = [&fib2](int n) -> int { static map<int,int> cache; if(n <= 2) { return 1; } else if(cache.find(n) == cache.end()) { cache[n] = fib2(n-1) + fib2(n-2); } return cache[n]; };generate(v.begin(), v.end(), [] { static int n = 1; return fib2(2); });for_each(v.begin(), v.end(), [] (int n) { cout << n << endl; });
  24. 24. Да, это тоже лямбда [](){}(); // я тоже ∃
  25. 25. Ключевое слово autoС++98 - ничего не делалоC++0x(N1984=06-0054) – определение типа по выражению : auto a = 7; // int auto b = 7.5; // double auto res = some_really_complicated_method<T, U>(v, a, b);Использование с лямбдами : auto print_lambda = [] (int n) { cout << n; } ... for_each(v.begin(), v.end(), print_lambda);Вместе с контейнерами STL : Было : for(vector<T>::const_iterator p = v.begin(); p!=v.end(); ++p) cout << *p << endl; Стало : for(auto p = v.begin(); p!=v.end(); ++p) cout << *p << endl;
  26. 26. Delegating Constructors (делегирование конструкторов)Делегирование конструкторов способ использования уженаписанных конструкторов class X { int i_; Public : X( int i ) : i_(i) { } X() : X(42) { } // использование X(int), i_ == 42 };Поддерживаются только в IBM XLC++ 11.1SC22/WG21/N1986 (revision 3)
  27. 27. Списки инициализации(Initializer Lists)Initializer Lists(N2672=08-0182) – возможность создания и инициализации объектапри помощи перечислений {..., ..., …}Для использование с объектом класса необходим конструкторstd::initializer_list<тип> struct S { S(std::initializer_list<double>); // #1 S(const std::string&); // #2 // ... }; const S& r1 = { 1, 2, 3.0 }; // #1 const S& r2 { "Spinach" }; // #2Два вида инициализации – с “=” и безПолезно при использовании вместе с контейнерами(no push_back → push_back →push_back way) : void foo(std::vector<int> v); …. foo({1, 2, 3, 4, 5});
  28. 28. Inheriting constructors (наследование конструкторов)Что, если дочерним классам разрешить использовать конструкторыбазового класса для своего создания?Синтаксис : struct B { B(int); }; struct D : B { using B::B; };Проблема : не поддерживает ни один компилятор, все ещеProposal(N2540=08-0050), рассматривается вопрос об удалении изстандарта(N3258=11-0028)
  29. 29. “Why doesn’t C++ have garbage collection? …… Because then there would be nothing left.”
  30. 30. Литература● JTC1/SC22/WG21 - The C++ Standards Committee http://www.open-std.org/jtc1/sc22/wg21/● Visual C++ Team Blog http://blogs.msdn.com/b/vcblog/● Bjarne Stroustroup – C++0x FAQ http://www2.research.att.com/~bs/C++0xFAQ.html● MSDN: Whats New in Visual C++ 2010 http://msdn.microsoft.com/en-us/library/dd465215.aspx
  31. 31. Bonus section
  32. 32. Raw and Unicode String LiteralsProposal : N2442, gcc 4.5/4.4Unicode – добавление типов char16_t и char32_t, гарантированразмер типа (кодировки UTF-16, and UTF-32)Для каждого типа – свои строковые литералы(Unicode String Literals) char* a = "Hello, world!"; // обычный Hello world char16_t* b = u"Hello, world!"; // префикс для строкового литерала - u char32_t* c = U"Hello, World!"; // префикс для строкового литерала - URaw String Literals – позволяет неэкранировать слэши (RegExps!) char* fileLoc = "C:Program FilesCompanySomeFile.exe"; //так было char* fileLoc = R"(C:Program FilesCompanySomeFile.exe)";
  33. 33. Fixed-Size Integer TypesТипы фиксированного размера – взяты из TR1 (ns std::tr1)● int8_t, int16_t int32_t, int64_t● int_least8_t, int_least16_t, int_least32_t, int_least64_t● int_fast8_t, int_fast16_t, int_fast32_t, int_fast64_t+ unsigned types uint##_tСтандарт : 18.4 Integer TypesВ литературе: Pete Becker "The C++ Standard Library Extensions".
  34. 34. Its nulltptr!Как вызвать func(char* ) для следующего кода? void func(int); void func(char *); int main() { func(0); // вызовется func(int) }С++98/03 решение : func( (char *)0); // uglyС++0x решение : введем ключевое слово nullptr, будет обозначать нулевые указатели func(nullptr);
  35. 35. Использование nullptrchar* ch = nullptr; // ch со значением nullptrchar* ch2 = 0; // ch2 со значением nullptrint n = nullptr; // ошибкаint n2 = 0; // n2 нольif( ch == 0 ); // истинаif( ch == nullptr ); // истинаif( ch ); // ложьif( n2 == 0 ); // истинаif( n2 == nullptr ); // ошибкаif( nullptr ); // ошибка, nullptr не приводим к boolif( nullptr == 0 ); // ошибка// Арифметикаnullptr = 0; // ошибка, nullptr не является lvaluenullptr + 2; // ошибка

×