Semble posix_memalign
vous laisse choisir un alignment
personnalisé, mais quand est-ce nécessaire?
malloc
a déjà effectué le travail d’alignement en interne.
METTRE À JOUR
La raison exacte pour laquelle je pose cette question est que je vois que nginx le fait, ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
, ici, NGX_POOL_ALIGNMENT
est défini comme 16
, nginxs.googlecode.com/svn-history/trunk/src/core/ngx_palloc.c
Fondamentalement, si vous avez besoin d’un alignement plus difficile que celui que malloc vous donnera. Malloc renvoie généralement un pointeur aligné de telle sorte qu’il puisse être utilisé avec l’un des types primitifs (souvent 8 octets sur des ordinateurs de bureau courants).
Cependant, vous avez parfois besoin d’une mémoire alignée sur d’autres limites, par exemple alignée sur 4K, etc. Dans ce cas, vous avez besoin de memalign
.
Vous auriez besoin de cela, par exemple,
Les seuls avantages de posix_memalign
, pour autant que je posix_memalign
, sont les suivants:
N
bits bas d’un pointeur zéro afin que vous puissiez stocker un entier à N
bits dans les bits bas. 🙂 Divers matériels peuvent avoir des exigences d’alignement que malloc
ne peut pas satisfaire. La page de manuel Linux en donne un exemple, je cite:
Sur de nombreux systèmes, il existe des ressortingctions d’alignement, par exemple sur les tampons utilisés pour les E / S de périphériques à blocage direct. POSIX spécifie l’appel pathconf (path, _PC_REC_XFER_ALIGN) qui indique quel alignement est nécessaire.
Quelques utilisations:
Certains processeurs ont des instructions qui ne fonctionneront que sur des données alignées sur une puissance égale ou supérieure à deux fois la taille de la mémoire tampon – par exemple, les instructions d’adressage inversé utilisées dans les fft (transformations rapides de Fourier).
Pour aligner les données sur les limites du cache afin d’optimiser l’access aux applications multitraitement afin que les données d’une même ligne de cache ne soient pas accédées simultanément par deux processeurs.
En gros, si vous n’avez pas besoin d’optimiser des niveaux absurdes et / ou si votre matériel n’exige pas qu’un tableau se trouve sur une limite particulière, vous pouvez oublier posix_memalign.