Vérification de l’alignement de la mémoire

Je veux vérifier si une mémoire allouée est alignée ou non. J’utilise _aligned_malloc(size, align); Et cela retourne un pointeur. Puis-je le vérifier en divisant simplement le contenu du pointeur par 16, par exemple? Si le contenu du pointeur est divisible par 16, cela signifie-t-il que la mémoire est alignée sur 16 octets?

Un pointeur “aligné” par définition signifie que la valeur numérique du pointeur est divisible de manière égale par N (où N est l’alignement souhaité). Pour vérifier cela, transformez le pointeur en un entier de taille appropriée, prenez le module N et vérifiez si le résultat est égal à zéro. Dans du code:

 bool is_aligned(void *p, int N) { return (int)p % N == 0; } 

Si vous souhaitez vérifier la valeur du pointeur à la main, il suffit de regarder la représentation hexadécimale du pointeur et de voir si elle se termine par le nombre requirejs de 0 bits. Un pointeur aligné sur 16 octets se terminera toujours par quatre bits zéro, par exemple.

Sur un système Unix moderne, un pointeur renvoyé par malloc est probablement aligné sur 16 octets, ce qui est nécessaire pour des choses comme SSE. Pour vérifier l’alignement d’une puissance de 2, vous pouvez utiliser:

 ((unsigned long)p & (ALIGN - 1)) == 0 

Ceci est simplement une version plus rapide de (p % ALIGN) == 0 . (Si ALIGN est une constante, votre compilateur utilisera probablement automatiquement la version plus rapide ci-dessus.)

La mémoire renvoyée par malloc est alignée pour tout (c’est-à-dire qu’elle utilise généralement un alignement qui fonctionne pour tout) *. Cela signifie que si vous avez un problème d’alignement, c’est autre chose.

http://www.delorie.com/gnu/docs/glibc/libc_31.html

http://msdn.microsoft.com/en-us/library/ms859665.aspx

(Il semble y avoir des exceptions pour les ordres d’alignement supérieurs, ce qui est de toute façon une exigence inhabituelle.)