La taille des variables



Selon le type de variable que vous demandez de créer (charintdoublefloat…), vous avez besoin de plus ou moins de mémoire.

En effet, pour stocker un nombre compris entre -128 et 127 (un char), on n'a besoin que d'un octet en mémoire. C'est tout petit.


En revanche, un int occupe généralement 4 octets en mémoire. Quant au double, il occupe 8 octets.

Le problème est… que ce n'est pas toujours le cas. Cela dépend des machines : peut-être que chez vous un int occupe 8 octets, qui sait ?


Notre objectif ici est de vérifier quelle taille occupe chacun des types sur votre ordinateur.

Il y a un moyen très facile pour savoir cela : utiliser l'opérateur sizeof().


Contrairement aux apparences, ce n'est pas une fonction mais une fonctionnalité de base du langage C. Vous devez juste indiquer entre parenthèses le type que vous voulez analyser.


Pour connaître la taille d'un int, on devra donc écrire :

sizeof(int)


À la compilation, cela sera remplacé par un nombre : le nombre d'octets que prend int en mémoire. Chez moi, sizeof(int) vaut 4, ce qui signifie que int occupe 4 octets. Chez vous, c'est probablement la même valeur, mais ce n'est pas une règle. Testez pour voir, en affichant la valeur à l'aide d'un printf par exemple :

printf("char : %d octets\n", sizeof(char));

printf("int : %d octets\n", sizeof(int));

printf("long : %d octets\n", sizeof(long));

printf("double : %d octets\n", sizeof(double));


Chez moi, cela affiche :

char : 1 octets

int : 4 octets

long : 4 octets

double : 8 octets


Je n'ai pas mis tous les types que nous connaissons, je vous laisse le soin de tester vous-mêmes la taille des autres types.

Vous remarquerez que long et int occupent la même place en mémoire. Créer un long revient donc ici exactement à créer un int, cela prend 4 octets dans la mémoire.


En fait, le type long est équivalent à un type appelé long int, qui est ici équivalent au type… int. Bref, ça fait beaucoup de noms différents pour pas grand-chose, au final ! Avoir de nombreux types différents était utile à une époque où l'on n'avait pas beaucoup de mémoire dans nos ordinateurs. On cherchait à utiliser le minimum de mémoire possible en utilisant le type le plus adapté.
Aujourd'hui, cela ne sert plus vraiment car la mémoire d'un ordinateur est très grande. En revanche, tous ces types ont encore de l'intérêt si vous créez des programmes pour de l'informatique embarquée où la mémoire disponible est plus faible. Je pense par exemple aux programmes destinés à des téléphones portables, à des robots, etc.


Peut-on afficher la taille d'un type personnalisé qu'on a créé (une structure) ?


Oui ! sizeof marche aussi sur les structures !

typedef struct Coordonnees Coordonnees;

struct Coordonnees

{

    int x;

    int y;

};


int main(int argc, char *argv[])

{

    printf("Coordonnees : %d octets\n", sizeof(Coordonnees));


    return 0;

}


 

Coordonnees : 8 octets


Plus une structure contient de sous-variables, plus elle prend de mémoire. Terriblement logique, n'est-ce pas ?

Une nouvelle façon de voir la mémoire


Jusqu'ici, mes schémas de mémoire étaient encore assez imprécis. On va enfin pouvoir les rendre vraiment précis et corrects maintenant qu'on connaît la taille de chacun des types de variables.

Si on déclare une variable de type int :

int nombre = 18;


… et que sizeof(int) indique 4 octets sur notre ordinateur, alors la variable occupera 4 octets en mémoire !

Supposons que la variable nombre soit allouée à l'adresse 1600 en mémoire. On aurait alors le schéma de la fig. suivante.





Ici, on voit bien que notre variable nombre de type int qui vaut 18 occupe 4 octets dans la mémoire.


Elle commence à l'adresse 1600 (c'est son adresse) et termine à l'adresse 1603. La prochaine variable ne pourra donc être stockée qu'à partir de l'adresse 1604 !

Si on avait fait la même chose avec un char, on n'aurait alors occupé qu'un seul octet en mémoire (fig. suivante).






Imaginez maintenant un tableau de int !


Chaque « case » du tableau occupera 4 octets. Si notre tableau fait 100 cases :

int tableau[100];


on occupera alors en réalité 4 * 100 = 400 octets en mémoire.


Même si le tableau est vide, il prend 400 octets ?


Bien sûr ! La place en mémoire est réservée, aucun autre programme n'a le droit d'y toucher (à part le vôtre). Une fois qu'une variable est déclarée, elle prend immédiatement de la place en mémoire.

Notez que si on crée un tableau de type Coordonnees :

Coordonnees tableau[100];


… on utilisera cette fois : 8 * 100 = 800 octets en mémoire.

Il est important de bien comprendre ces petits calculs pour la suite du chapitre.

Créé avec HelpNDoc Personal Edition: Qu'est-ce qu'un outil de création d'aide ?