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#
État initial
Déclaration du tableau
vector<int> t;
Allocation du tableau
t = vector<int>(6);
Initialisation
t[0] = 1; ...
Sémantique : allocation d’un tableau
t = vector<int>(6);
Une suite contiguë de cases est allouée sur le tas
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 tableauObtenue 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/)#
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 :
Déclaration
Allocation
Sans cela : faute de segmentation (au mieux!)Initialisation
Sans cela : même problème qu’avec les variables usuelles
Indication
À retenir
Lors de l’accès à une case
i
d’un tableaut
, il faut toujours vérifier les bornes :0 <= i
eti < 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.