210 likes | 318 Views
Rappels C++. Les pointeurs. Notion de pointeurs. Travailler avec les pointeurs c’est Se rapprocher du matériel Nécessite de bien connaitre le fonctionnement de la mémoire Faire des applications rapides Faire des applications bugées Avoir mal à la tête. Notion de pointeurs.
E N D
Rappels C++ Les pointeurs
Notion de pointeurs • Travailler avec les pointeurs c’est • Se rapprocher du matériel • Nécessite de bien connaitre le fonctionnement de la mémoire • Faire des applications rapides • Faire des applications bugées • Avoir mal à la tête
Notion de pointeurs • Travailler avec les pointeurs c’est • Se rapprocher du matériel • Faire des applications rapides • Réserver la mémoire quand on en a besoin • Faire des applications bugées • Avoir mal à la tête
Notion de pointeurs • Travailler avec les pointeurs c’est • Se rapprocher du matériel • Faire des applications rapides • Faire des applications bugées • Oublier de libérer la mémoire • « segmentation fault » • Avoir mal à la tête
Notion de pointeurs • Travailler avec les pointeurs c’est • Se rapprocher du matériel • Faire des applications rapides • Faire des applications bugées • Avoir mal à la tête • Des comportements du programme bizarre • Des raisonnements très poussés
Rassurons nous un peu… • Les pointeurs, c’est compliqué • En effet, même les plus grands programmateurs font encore ce genre d’erreurs (Windows, Half-Life…) • Les pointeurs, c’est pour nous faire ch.. • En effet, on en aura bientôt plus besoin (java, C#...)
Mais… • Les pointeurs, c’est pas si compliqué • Avec de la méthode et en prenant du temps, on y arrive (et même facilement) • Les pointeurs, c’est utile • Lorsque l’on recherche la rapidité (jeux vidéo, programmation Temps réel,…) on est obligé d’y passer
(Rappels sur ) le matériel • Organisation de la mémoire Paramètres des fonctions Variables dynamiques (les pointeurs) Variables statiques (toutes les variables sauf les pointeurs) Programme réel (toto.exe) Comprend le code et les constantes
Suite des rappels • Zoom sur la pile et le tas Augmente quand on appelle une fonction (on empile les paramètres de la fonction et les paramètres locaux (et 2-3 autres trucs)) Augmente quand on fait appel à l’instruction new
Rappels… 4AC0 4ABF 4ABE • Finalement : Tas int i; int *p; i=23; //diff entre i et &i ? p=&i; • //diff entre p et *p ? i=58; • //valeur de *p ? • p=new int; • *p=6; 23AA 23A9 6 23A8 23A8 p 23A6 23A8 23A7 BSS 23A6 i 23 58 F3DE 23A5 Prog 0F4D 23A4
Rappels… 4AC0 4ABF 4ABE • Exemples de bugs : Tas 23AA 6 23A9 23A9 23A9 int *p; • p=new int; • p=new int; • *p=6; 23A8 23A8 23A8 p 23A8 23A9 23A7 BSS 23A6 F3DE 0F4D 23A5 Prog 23A4
Rappels… 4AC0 4ABF 4ABE • Exemples de bugs : Tas • int *p; • int *q; • p=new int; • q=p; • *p=6; • delete p; • cout<<*q; Segmentation Fault !!! 23AA 23A9 6 23A8 23A8 p 23A8 23A7 BSS 23A6 q 23A8 23A5 F3DE Prog 0F4D 23A4
De la mémoire sur mesure • Half life 2 : 4Go de texture, de sons… • Windows Vista : 4Go de programmes… • Question : • Comment faire pour jouer à Half Life 2 quand on exécute Windows Vista sur une machine ne disposant que de 1Go de mémoire vive?
Réponse • Vista et Half Life2 ne doivent pas charger tout en mémoire… Uniquement ce qu’il faut • Conclusion : • Vive les pointeurs
Utilité du pointeur : • On veut charger une map? • new… • On veut décharger une map ? • delete... D’où l’explication du « loading » Succession de new et delete…
Utilité du pointeur • OK, c’est utile… On utilise plus que ça? • C’est tout a fait possible, mais : • Très compliqué à utiliser • Penser à faire un deletedès que nécessaire • 3 instructions pour l’utiliser (déclarer, newet delete) • Coûteux en terme de place • Un entier pour sauver l’adresse en mémoire • L’objet en lui même
Quand utiliser un pointeur ? • Quand on utilise un « gros » objet. • Quand l’objet contient beaucoup d’attributs • Quand on sait ne sait pas quand on aura besoin de la variable • Interaction avec utilisateur, paquets réseau… • Quand on fait un exercice sur les pointeurs…
Quand utiliser un pointeur ? • Une fois les bases apprises et acquises, on est tenté d’en utiliser partout. • Danger : oublier de faire un delete ! • IMPORTANT: • Implémenter les destructeurs à chaque fois que l’on a un attribut de type pointeur !
void main(){ node exemple(0); exemple.valeur=0; exemple.suivant=new node(5); node *iter; iter=&exemple; iter=iter->suivant; node *iter2=iter; iter2->suivant=new node(10); iter2=iter2->suivant; iter2->suivant=new node(20); iter2=null; iter=null; deleteiter; iter=null; } class node{ int valeur; node *suivant; } 00A0 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF 00B0 Code du programme BSS Tas
void main(){ node *iter=new node(-1); for(int i=0;i<5;i++){ iter->suivant=new node(i); iter=iter->suivant(); }; node *iter1=iter; iter=iter1; for(int i=0;i<5;i++){ cout<<iter->valeur; iter=iter->suivant(); } } class node{ int valeur; node *suivant; } 00A0 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF 00B0 Code du programme BSS Tas
void main(){ node *iter=new node(-1); node *iter1=iter; for(int i=0;i<5;i++){ iter->suivant=new node(i); iter=iter->suivant(); } iter=iter1; while (iter != null) { cout<<iter->valeur; iter=iter->suivant(); } } class node{ int valeur; node *suivant; } 00A0 00A1 00A2 00A3 00A4 00A5 00A6 00A7 00A8 00A9 00AA 00AB 00AC 00AD 00AE 00AF 00B0 Code du programme BSS Tas