#include <stdlib.h> // <cstdlib> en C++
void * aligned_alloc( size_t alignment, size_t memorySize );
Cette fonction, introduite dans la norme C ISO 2011, permet de réaliser une allocation mémoire, tout comme la fonction malloc
.
La principale différence est que, comme son nom l'indique, la fonction aligned_alloc
garantie que l'adresse de mémoire du bloc alloué est
multiple de alignment
.
La fonction aligned_alloc
est « thread-safe ».
alignment : spécifie la taille de l'alignement. Doit être un multiple de la taille des mots du processeur (fréquemment 4 ou 8 octets).
memorySize : permet de spécifier la taille, en octets, du bloc de mémoire à allouer.
Doit être un multiple du paramètre alignment
.
Si tout ce passe bien, la fonction vous renvoie un pointeur sur la zone nouvellement allouée. Attention, ce pointeur est de type pointeur générique (void *) : si nécessaire, il est donc de votre responsabilité de "caster" votre pointeur vers un autre type (du moins si vous souhaitez ne pas avoir de warning affiché pas le compilateur, ce que je vous recommande vivement).
Dans le cas ou le bloc de mémoire ne pourrait vous être réservé (plus de mémoire disponible, par exemple), le pointer NULL vous
sera retourné. On derait normalement et systématiquement tester que l'on ait pas cette valeur. Néanmoins cela n'est pas toujours
fait par les développeurs. Donc un petit conseil, utilisez au moins un assert
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <stdio.h> #include <stdlib.h> #define ALIGN_SIZE 1024 int main() { int * p2 = aligned_alloc( ALIGN_SIZE, ALIGN_SIZE ); if ( ((unsigned long) p2) % ALIGN_SIZE != 0 ) { fputs( "Pas possible\n", stderr ); abort(); } // Un utilise le bloc de mémoire free( p2 ); return EXIT_SUCCESS; } |
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :