Rechercher
 

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 :

Fonction aligned_alloc (C11)

La fonction abort La fonction atexit


Entête à inclure

#include <stdlib.h>  // <cstdlib> en C++

Fonction aligned_alloc (C11)

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.

Dans la théorie de la compilation, l'alignement des données en mémoire permet de garantir des performances optimales. Je ne vais pas rentrer dans toutes la théorie, mais sachez que si vos données sont placées à des adresses mémoire multiples de la taille des mots du processeur, alors leurs manipulations seront plus rapides. Dans les cas ou vous recherchez des performances optimales, il faut que votre alignement soit lui-même un multiple de la taille des mots du processeur.

La fonction aligned_alloc est « thread-safe ».

Paramètres

Valeur de retour

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.

Exemple de code

 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;
}
Exemple d'utilisation de la fonction aligned_alloc

Sujets connexes

<stdlib.h>
calloc
free
malloc
realloc


La fonction abort La fonction atexit