Mise en cache de caractères

Code source du fichier : cache.h

#ifndef CACHE_H_INCLUDED
#define CACHE_H_INCLUDED

#define TAILLECACHE 1000 /* taille de l'espace disponible */
static char cache[TAILLECACHE]; /* espace memoire pour allouer */
static char *p_allocation = cache; /* espace libre suivant */

/* Retourne un pointeur sur n caracteres */
char *allouer(int n)
{
    if (cache + TAILLECACHE - p_allocation >= n) {
        /* Assez de place disponible dans le cache pour allouer */
        p_allocation += n;
        return p_allocation - n; /* retourne l'ancien pointeur */
    } else {
        /* pas assez de place */
        return NULL;
    }
}


/* libere l'espace memoire pointe par p */
void liberer(char *p)
{
    if (p >= cache && p < cache+TAILLECACHE) {
        p_allocation = p;
    }
}

/* Retourne le pointeur sur l'espace
 libre suivant */
char *getIndex()
{
    return p_allocation;
}

#endif // CACHE_H_INCLUDED

Code source du fichier : main.c

#include <stdio.h>
#include <stdlib.h>
#include "cache.h"


int main(void)
{

    printf("Adresse du pointeur index  : %p\n", getIndex());
    char * p_mot10 = allouer(10);
    printf("Adresse du pointeur allouant 10 caracteres : %p\n",
        p_mot10);
    char * p_mot5 = allouer(5);
    printf("Adresse du pointeur allouant 5 caracteres : %p\n",
        p_mot5);
    /* pointeur allouant trop d'espace */
    char * p_motTooLong = allouer(20000); 
    printf("Adresse du pointeur allouant 20000 caracteres" 
       " (trop long) : %p\n", p_motTooLong);
    printf("Liberation cache\n");
    liberer(p_mot5);
    liberer(p_mot10);
    liberer(p_motTooLong);
    printf("Adresse du pointeur index  : %p\n", getIndex());
}

  Vous pouvez retrouver ces fichiers dans l'archive cache.tgz.

 


L'archive comprends les fichiers suivants :

 

 

  • cache.h : déclarations et implémentation des fonctions de manipulation du cache.
  • main.c : exemple d'utilisation des fonctions de cache.h.

 

  Exécution

$gcc main.c -o cache
$chmod +x cache
$./cache

 

Adresse du pointeur index  : 0x6012a0
Adresse du pointeur allouant 10 caracteres : 0x6012a0
Adresse du pointeur allouant 5 caracteres : 0x6012aa
Adresse du pointeur allouant 20000 caracteres : (nil)
Liberation cache
Adresse du pointeur index  : 0x6012a0