Modèle de mémoire et tableaux#

Définition : Pile et tas

L’espace mémoire d’un programme est partagé en deux zones :

  • La pile (stack) : variables locales des fonctions

  • Le tas (heap) : le reste

Exemple de construction d’un tableau#

#include<vector>
using namespace std;
vector<int> t;      // Déclaration
t = vector<int>(6); // Allocation
t[0] = 1;           // Initialisation
t[1] = 4;
t[2] = 1;
t[3] = 5;
t[4] = 9;

Exemple de construction d’un tableau : mémoire#

  1. État initial

    ../_images/pile-tas-etat-initial.png
  1. Déclaration du tableau

        vector<int> t;
    
    ../_images/pile-tas-declaration.png
  1. Allocation du tableau

        t = vector<int>(6);
    
    ../_images/pile-tas-allocation.png
  1. Initialisation

        t[0] = 1;
        ...
    
    ../_images/pile-tas-initialisation-1.png

Sémantique : allocation d’un tableau

t = vector<int>(6);
  1. Une suite contiguë de cases est allouée sur le tas

  2. La taille et une référence vers la première des cases est stockée dans t

Sémantique : lecture et écriture dans un tableau

t[i]
  • La i-ème case du tableau

  • Obtenue en suivant la référence et se décalant de \(i\) cases

  • Rappel : pas de vérifications!!!

Retour sur l”exemple de piratage par débordement#

Heartblead expliqué (http://xkcd.com/1354/)#

../_images/xkcd_heartbleed_explanation_1.jpg
../_images/xkcd_heartbleed_explanation_1.jpg

Tableaux et allocation mémoire#

Indication

À retenir

  • Une valeur de type tableau ne contient pas directement les cases du tableau, mais l’adresse en mémoire de celles-ci (référence) et la taille du tableau.

Indication

À retenir

  • Une variable de type tableau se construit en trois étapes :

    1. Déclaration

    2. Allocation
      Sans cela : faute de segmentation (au mieux!)

    3. Initialisation
      Sans cela : même problème qu’avec les variables usuelles

Indication

À retenir

  • Lors de l’accès à une case i d’un tableau t, il faut toujours vérifier les bornes : 0 <= i et i < t.size()
    Sans cela : faute de segmentation (au mieux!)

Sémantique : affectation de tableaux#

Exemple

Quelles sont les valeurs de t[0] et t2[0] après l’exécution du programme suivant?

vector<int> t = { 1, 4, 1, 5, 9, 2 };
vector<int> t2;
t2 = t;             // Affectation
t2[0] = 0;
t[0]
t2[0]

Indication

À retenir

  • En C++, lors d’une affectation, un vector est copié!

  • On dit que vector a une sémantique de copie.

  • Différent de Java, Python ou des tableaux C!

Sémantique : tableaux et fonctions ♣#

Exemple

Quelle est la valeur de tableau[0] après l’exécution du programme suivant?

#include <vector>
using namespace std;
void modifie(vector<int> t) {
    t[0] = 42;
}
vector<int> tableau = { 1, 2, 3, 4 };
modifie(tableau)
tableau[0]

Indication

Fonctions et tableaux

En combinant la sémantique de l’appel de fonctions et celle de l” affectation de tableaux, on déduit que :

  • Appel de fonction \(\Longrightarrow\) Affectation des paramètres \(\Longrightarrow\) copie

  • Donc, les vector de C++ sont passés par valeur aux fonctions

Astuce

Astuce La fonction peut renvoyer le tableau modifié!

#include <vector>
using namespace std;
using tableau = vector<int>;
tableau modifie(vector<int> t) {
    t[0] = 42;
    return t;
}
vector<int> tableau = { 1, 2, 3, 4 };
tableau = modifie(tableau)
tableau[0]

Note

Vous verrez au second semestre comment passer les tableaux par référence aux fonctions, notamment pour des questions de performances.