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