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
cache.tgz