allocation de mémoire alignée

allocation de mémoire alignée - C - Programmation

Marsh Posté le 08-03-2006 à 02:32:34    

Salut,
 
je dois écrire une fonction d'allocation de mémoire qui l'alignera suivant la valeur envoyée (avec la fonction free qui va avec bien sûr) mais j'ai du mal à comprendre le principe.
 
J'ai compris le principe de l'alignement (enfin je crois), mais pas encore comment le faire.
Au début je pensais pouvoir faire un truc genre :  
char * ptr = (char *) malloc (size);
puis regarder si ptr est sur une bonne adresse par rapport à l'aligment demandé, et faire quelque chose en suite, mais cela n'a pas l'air d'une bien bonne idée ...
J'ai trouver une source toute faite mais j'ai envie d'apprendre, et de le faire à ma manière ...
Pourtant je ne trouve pas l'illumination
 
Merci bien,

Reply

Marsh Posté le 08-03-2006 à 02:32:34   

Reply

Marsh Posté le 08-03-2006 à 03:07:59    

ou interviens tu dans l'histoire?
 
tu dois reecrire malloc et free? ou juste faire en sorte que les pointeurs soient alignes au retour de malloc?
 
car si tel est le cas, malloc te renvois automatiquement des pointeurs alignes en memoire...

Reply

Marsh Posté le 08-03-2006 à 03:19:07    

Salut,
 
je dois me servir de malloc et free. Par contre les pointeurs sont alignés automatiquement, mais moi j'aurais besoin de les aligner en fonction d'une valeur d'alignement envoyé.

Reply

Marsh Posté le 08-03-2006 à 04:10:25    

normalement j'ai fini :

Code :
  1. void * aligned_malloc(size_t bytes, size_t alignment)
  2. {
  3.        void *real = malloc(bytes + alignment +sizeof(int));
  4. if (real == NULL)
  5.  return(NULL);
  6. void *aligned = (alignment - (int)(real + sizeof(int)) % alignment) +real+sizeof(int);
  7. printf("%d\n",real);
  8. printf("%d\n",aligned);
  9. *((int *) (aligned - sizeof(int))) = (int)real;
  10. printf("%d\n", *((int *) (aligned - sizeof(int))));
  11. return (aligned);
  12. }
  13. void aligned_free(void * p)
  14. {
  15. free( (void *) (*((int*)(p-sizeof(int)))));
  16. }


Message édité par gee le 08-03-2006 à 05:38:17
Reply

Marsh Posté le 08-03-2006 à 10:07:16    

gee a écrit :

je dois écrire une fonction d'allocation de mémoire qui l'alignera suivant la valeur envoyée (avec la fonction free qui va avec bien sûr) mais j'ai du mal à comprendre le principe.


Ce que tu veux faire n'est pas portable.
 
En effet, soit il s'agit d'un alignement propre à ta machine at dans ce cas, malloc() fourni déjà le bon alignement pour tout type d'objet C possible.
 
Mais si il s'agit d'un alignement 'physique' pour de la DMA ou un composant electronique particulier, par exemple, il faut faiire ton propre allocateur. En effet, les adresses vues de l'utilisateur n'ont absolument rien à voir avec les adresses physiques, du moins sur mes machines avec MMU (c'est le cas quasiment partout, y compris en embarqué).
 
Je pense qu'il y a un problème de conception.  
 
Explique ce que tu veux faire exactement et surtout pourquoi.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-03-2006 à 14:23:07    

Salut,
oui ce sont des adresses virtuelles je sais :)
je n'ai pas encore exactement compris le but, c'est un exercice qu'on m'a donné à faire. Mais en effet sans comprendre le but ce n'est pas totalement évident ... :)
 
je pense devoir utiliser malloc pour allouer, sauf que malloc alligne en fontcion de la taille de la variable (enfin plus le compilateur mais bon ..) mais là il faut aligner à la demande :)


Message édité par gee le 08-03-2006 à 14:26:00
Reply

Marsh Posté le 08-03-2006 à 14:54:52    

posix_memalign

Reply

Marsh Posté le 08-03-2006 à 15:00:58    

oui ca rejoint cette fonction, sauf que là il faut que je code l'extension à malloc moi même :). Plus memalign tout court en fait, bien qu'obsolète.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed