Introduction aux nouveautés du C++ 11



Documents pareils
Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Programmer en JAVA. par Tama

Analyse de sécurité de logiciels système par typage statique

INFO-F-105 Language de programmation I Séance VI

Auto-évaluation Programmation en Java

Bases de programmation. Cours 5. Structurer les données

as Architecture des Systèmes d Information

Une introduction à Java

et Programmation Objet

Cours d initiation à la programmation en C++ Johann Cuenin

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

4. Groupement d objets

COMPARAISONDESLANGAGESC, C++, JAVA ET

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Cours 1: Java et les objets

Les structures. Chapitre 3

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

TP, première séquence d exercices.

Les processus légers : threads. Système L3, /31

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Classe Interne, Anonyme & Enumération

Introduction à C++ et à wxwidgets

Algorithmique et Programmation, IMA

Programmation MacOSX / ios

Module.NET 3 Les Assemblys.NET

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

M2-Images. Rendu Temps Réel - OpenGL 4 et compute shaders. J.C. Iehl. December 18, 2013

Package Java.util Classe générique

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Utiliser Java sans BlueJ

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Programmation en C/C++

Introduction à la programmation concurrente

LE LANGAGE C++ ENAC 1997 A. DANCEL

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Java Licence Professionnelle CISII,

Java 1.5 : principales nouveautés

Cours d Algorithmique et de Langage C v 3.0

Le langage C++ (partie I)

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Problèmes liés à la concurrence

La programmation orientée objet et le langage C++

Avertissement : Ce cours suppose la connaissance et la maîtrise du langage C CONTENU DU COURS BIBLIOGRAPHIE

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Génie Logiciel avec Ada. 4 février 2013

Conventions d écriture et outils de mise au point

Création d objet imbriqué sous PowerShell.

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

TP1 : Initiation à Java et Eclipse

Génération de code binaire pour application multimedia : une approche au vol

Introduction au langage C

Premiers Pas en Programmation Objet : les Classes et les Objets

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Les structures de données. Rajae El Ouazzani

Gestion mémoire et Représentation intermédiaire

Programmation Par Objets

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Machines Virtuelles. et bazard autour. Rémi Forax

Chapitre VI- La validation de la composition.

Une bibliothèque de templates pour CUDA

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Principes des langages de programmation INF 321. Eric Goubault

Plan du cours. Historique du langage Nouveautés de Java 7

Chap III : Les tableaux

Objets et Programmation. origine des langages orientés-objet

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

A QUOI SERVENT LES BASES DE DONNÉES?

LOG4430 : Architecture et conception avancée

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Vérification formelle de la plate-forme Java Card

Claude Delannoy. 3 e édition C++

Le langage C. Séance n 4

Département Automatisation et Informatisation Année Programmation en C++ Institut des Sciences et Techniques de l Ingénieur d Angers

Projet de programmation (IK3) : TP n 1 Correction

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

Introduction à MATLAB R

Plan du cours Cours théoriques. 29 septembre 2014

Algorithmique, Structures de données et langage C

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

1.6- Génération de nombres aléatoires

Bernard HAMM, Évelyne LAVOISIER

Programmation par les Objets en Java

Transcription:

Introduction aux nouveautés du C++ 11 Miss Réunion Laurent NOËL laurent.noel.c2ba@gmail.com http://igm.univ-mlv.fr/ lnoel 07/05/2013 Laurent NOËL 07/05/2013 C++ 11 1 / 39

nullptr Quel est le problème de ce code? Code #include <cstdlib> void f(int x) { void f(void* ptr) { int main() { f(null); return 0; Laurent NOËL 07/05/2013 C++ 11 2 / 39

nullptr Erreur In function int main() : 12:11: error: call of overloaded f(null) is ambiguous 12:11: note: candidates are: 3:6: note: void f(int) 7:6: note: void f(void*) Laurent NOËL 07/05/2013 C++ 11 3 / 39

nullptr Problèmes de la constante NULL: De type int Nécessite le header cstdlib Laurent NOËL 07/05/2013 C++ 11 4 / 39

nullptr nullptr est une constante de type nullptr t destinée à remplacer l utilisation du typedef NULL. New school #include <cstdlib> void f(int x) { void f(void* ptr) { int main() { f(nullptr); return 0; Laurent NOËL 07/05/2013 C++ 11 5 / 39

auto Old school std::vector<int> v; for(std::vector<int>::iterator it = v.begin(); it!= v.end(); ++it) { // do something New school std::vector<int> v; for(auto it = v.begin(); it!= v.end(); ++it) { // do something Une variable déclarée auto est typée! Ce n est pas du typage dynamique. Laurent NOËL 07/05/2013 C++ 11 6 / 39

auto Très utile lorsqu on ne connait pas le type de retour d une fonction: int plus(int a, int b) { return a + b; auto plus_5 = std::bind(plus, 5, std::placeholders::_1); // Affiche 11 std::cerr << plus_5(6) << std::endl; Laurent NOËL 07/05/2013 C++ 11 7 / 39

auto Pointeurs et références: int var = 58; auto& ref = var; ref = 12; // var vaut 12 auto* ptr = &var; *ptr = 0; // var vaut 0 Laurent NOËL 07/05/2013 C++ 11 8 / 39

std::begin() et std::end() Old school std::vector<int> v; for(auto it = v.begin(); it!= v.end(); ++it) { // do something New school std::vector<int> v; for(auto it = begin(v); it!= end(v); ++it) { // do something Laurent NOËL 07/05/2013 C++ 11 9 / 39

std::begin() et std::end() Fonctionne également avec les tableaux statiques: New school int t[] = { 1, 2, 3, 4 ; for(auto it = begin(t); it!= end(t); ++it) { // do something L utilisation de begin et end en fonctions non-membre permet de rendre le code plus homogène et plus générique. La classe conteneur utilisée n a plus à fournir les méthodes begin et end pour être parcourue par itérateur: il suffit de surcharger les version non-membre des fonctions. Laurent NOËL 07/05/2013 C++ 11 10 / 39

Boucle de type for-each Old school std::vector<int> v; for(auto it = v.begin(); it!= v.end(); ++it) { // do something New school std::vector<int> v; for(auto value: v) { // do something Sucre syntaxique powa :D Laurent NOËL 07/05/2013 C++ 11 11 / 39

Smart pointers Quel est le problème de ce code? Old school void f() { int* ptr = new int(0); // do something delete ptr; Laurent NOËL 07/05/2013 C++ 11 12 / 39

Smart pointers Pour éviter les fuites! New school void f() { std::unique_ptr<int> ptr(new int(0)); // do something Le destructeur de unique ptr se charge d appeler delete: c est l idiome RAII. Un object de type unique ptr se comporte comme un pointeur classique: les opérateur * et -> sont définis. Il est possible de récupérer le pointeur brut avec la méthode get(). Laurent NOËL 07/05/2013 C++ 11 13 / 39

unique ptr Ne peux pas etre copié dans un autre unique ptr Bad code void f(const std::unique_ptr<int> ptr) { // do something void g(const std::unique_ptr<int>& ptr) { // do something std::unique_ptr<int> ptr(new int(0)); f(ptr); // ERREUR, tentative de passage par copie g(ptr); // OK, passage par reference Permet de s assurer qu un pointeur n est possédé que par un seul unique ptr. Laurent NOËL 07/05/2013 C++ 11 14 / 39

shared ptr Contient un compteur de références: lorsque le compteur arrive à 0 l objet contenu est détruit: C++11 void f(std::shared_ptr<int> ptr) { // do something std::shared_ptr<int> ptr(new int(0)); // Compteur à 1 f(ptr); // Le compteur passe à 2 dans la fonction // Sortie de la fonction le compteur repasse à 1 Permet de partager la ressource: aucun objet n est réellement désigné comme le propriétaire. Laurent NOËL 07/05/2013 C++ 11 15 / 39

Bonnes pratiques Ne pas créer de shared ptr en appelant new directement: utiliser make shared: C++11 // Pointeur de type int, valeur initialisée à 0. auto ptr = std::make_shared<int>(0); struct Vec3 { float x, y, z; Vec3(float x, float y, float z): x(x), y(y), z(z) { ; // Pointeur de type Vec3, value initialisée à (1, 2, 3) auto ptr2 = std::make_shared<vec3>(1, 2, 3); En C++14, make unique fera son apparition. Laurent NOËL 07/05/2013 C++ 11 16 / 39

Avec de l héritage Les smart pointeurs permettent également le sous-typage: C++11 struct Base { virtual Base() { ; struct Derived: public Base { ; std::shared_ptr<base> ptr = std::make_shared<derived>(); Laurent NOËL 07/05/2013 C++ 11 17 / 39

Move semantic Quel est le problème de ce code: C++ std::vector<int> computesequence(int n) { std::vector<int> v; for(int i = 0; i < n; ++i) { v.push_back(i); return v; std::vector<int> v = computesequence(1000000000); Laurent NOËL 07/05/2013 C++ 11 18 / 39

Move semantic Quel est le problème de ce code: C++ std::unique_ptr<int> alloc_int(int value) { return std::unique_ptr<int>(value); std::unique_ptr<int> ptr = alloc_int(10); Laurent NOËL 07/05/2013 C++ 11 19 / 39

Move semantic Nouveaux concept: Move constructor et Move copy operator. Laurent NOËL 07/05/2013 C++ 11 20 / 39

Move semantic class BigVector { int* m_pdata; public: BigVector(): m_pdata(new int[1000000]) { BigVector() { delete [] m_pdata; ; Laurent NOËL 07/05/2013 C++ 11 21 / 39

Move semantic // Copy constructor: slow BigVector(const BigVector& v): m_pdata(new int[1000000]) { std::copy(v.m_pdata, v.m_pdata + 1000000, m_pdata); // Copy operator: slow BigVector& operator =(const BigVector& v) { std::copy(v.m_pdata, v.m_pdata + 1000000, m_pdata); return *this; Laurent NOËL 07/05/2013 C++ 11 22 / 39

Move semantic BigVector computebigvector() { BigVector v; // do something return v; BigVector v = computebigvector(); // Arg! Copy Laurent NOËL 07/05/2013 C++ 11 23 / 39

Move semantic // Move constructor: fast BigVector(BigVector&& v): m_pdata(v.m_pdata) { v.m_pdata = nullptr; // Move operator: fast BigVector& operator =(const BigVector& v) { m_pdata = v.m_pdata; v.m_pdata = nullptr; return *this; Laurent NOËL 07/05/2013 C++ 11 24 / 39

Move semantic BigVector computebigvector() { BigVector v; // do something return v; BigVector v = computebigvector(); // Yeah move your body! Laurent NOËL 07/05/2013 C++ 11 25 / 39

Move semantic Forcer le move: BigVector v = computebigvector(); BigVector copy = v; BigVector stealer = std::move(v); // Han! // Attention: ne plus utiliser v ici! Laurent NOËL 07/05/2013 C++ 11 26 / 39

Perfect forwarding Problème: class C { public: void setv(const BigVector& v) { m_v = v; // Copy private: BigVector m_v; ; C c; c.setv(computebigvector()); Ici on copie alors qu on pourrait move! Laurent NOËL 07/05/2013 C++ 11 27 / 39

Perfect forwarding Solution 1: class C { public: void setv(const BigVector& v) { m_v = v; // Copy void setv(bigvector&& v) { m_v = std::move(v); private: BigVector m_v; ; Laurent NOËL 07/05/2013 C++ 11 28 / 39

Perfect forwarding Solution 2: Perfect forwarding class C { public: template<typename T> void setv(t&& v) { m_v = std::forward(v); private: BigVector m_v; ; Laurent NOËL 07/05/2013 C++ 11 29 / 39

Lambdas int RandomNumber () { return std::rand() % 100; void f() { std::vector<int> v(16); std::generate(begin(v), end(v), RandomNumber); C est chiant de définir une fonction pour faire ça, non? La fonctionnalité requise est très locale. Laurent NOËL 07/05/2013 C++ 11 30 / 39

Lambdas void f() { std::vector<int> v(16); std::generate(begin(v), end(v), []() -> int { return std::rand() % 100; ); Ici on utilise un lambda, directement au moment de l appel à generate. Laurent NOËL 07/05/2013 C++ 11 31 / 39

Lambdas Syntaxe: [capture](args) -> return_type { // body La capture permet de récupérer des variables locales environnantes: int i = 5; auto ret_i = [i]() -> int { return i; cout << ret_i() << endl; // affiche 5 i = 12; cout << ret_i() << endl; // affiche 5 aussi! Laurent NOËL 07/05/2013 C++ 11 32 / 39

Lambdas Capture par référence: int i = 5; auto ret_i = [&i]() -> int { return i; cout << ret_i() << endl; // affiche 5 i = 12; cout << ret_i() << endl; // affiche 12 Laurent NOËL 07/05/2013 C++ 11 33 / 39

Lambdas Capturez les tous! int i; // Capture toutes les variables accessibles par valeur auto ret_i = [=]() -> int { return i; // Capture toutes les variables accessibles par référence auto set_i = [&](int a) -> int { i = a; Laurent NOËL 07/05/2013 C++ 11 34 / 39

Nouvelle syntaxe pour les types de retour Exemple: int f(float x) { return int(x); // Peut aussi s écrire: auto f(float x) -> int { return int(x); Quel est l interêt? Laurent NOËL 07/05/2013 C++ 11 35 / 39

Nouvelle syntaxe pour les types de retour template<typename T> struct Vec2 { T x, y; Vec2(T x, T y): x(x), y(y) { ; template<typename T> Vec2<T> operator +(Vec2<T> v1, Vec2<T> v2) { return Vec2<T>(v1.x + v2.x, v1.y + v2.y); Vec2<int> vint; Vec2<float> vfloat; Vec2<float> r = vint + vfloat; // Ne compile pas Laurent NOËL 07/05/2013 C++ 11 36 / 39

Nouvelle syntaxe pour les types de retour Le C++11 propose l instruction decltype(expr) qui renvoit le type d une expression. Ce qu on voudrait faire: template<typename T1, typename T2> Vec2<decltype(v1.x + v2.x)> operator +(Vec2<T1> v1, Vec2<T2> v2) { typedef decltype(v1.x + v2.x) T; return Vec2<T>(v1.x + v2.x, v1.y + v2.y); Mais v1 et v2 ne sont pas déclarées au moment ou le premier decltype() est utilisé; Laurent NOËL 07/05/2013 C++ 11 37 / 39

Nouvelle syntaxe pour les types de retour Il faut donc utiliser la nouvelle syntaxe: template<typename T1, typename T2> auto operator +(Vec2<T1> v1, Vec2<T2> v2) -> Vec2<decltype(v1.x + v2.x)> { typedef decltype(v1.x + v2.x) T; return Vec2<T>(v1.x + v2.x, v1.y + v2.y); Laurent NOËL 07/05/2013 C++ 11 38 / 39

Liste non exhaustive des points non traités static assert et le header type traits les mots clef override et final les types énumérés fortement typés les extensions de la STL: thread, atomic, regexp, tuple, array, unordered containers. Variadic templates... Laurent NOËL 07/05/2013 C++ 11 39 / 39