L'alignement exigences de préciser quelle est l'adresse à des décalages peuvent être attribués à quels types. Ce qui est totalement dépendant de l'implémentation, mais est généralement basée sur la taille de mot. Par exemple, certaines architectures 32 bits exiger de tous les int variables de démarrer sur un multiple de quatre. Sur certaines architectures, l'alignement des exigences absolues. Sur d'autres (par exemple x86) se moquer d'eux vient seulement avec une perte de performance.
malloc est tenu de retourner une adresse convenable pour tout alignement exigence. En d'autres termes, le retour de l'adresse peut être attribué à un pointeur de type quelconque. De C99 §7.20.3 (fonctions de gestion de Mémoire):
Le pointeur retourné si la répartition
réussit est correctement alignés de sorte que
il peut être assigné à un pointeur vers n'importe quel
type d'objet, puis utilisé pour accéder
un tel objet ou un tableau de ces
les objets dans l'espace alloué (jusqu'
l'espace est explicitement libéré).
Le problème est que sur certaines architectures des processeurs, les instructions pour charger un entier de 4 octets à partir de la mémoire ne fonctionne que sur les limites de word. Ainsi, votre programme devra aller chercher chaque moitié de b avec des instructions distinctes.
L'accès à b devient simple. (L'inconvénient est que plus de mémoire est nécessaire, parce que des octets de remplissage.)
Différents types de données ont différentes exigences alignement. Il est commun pour char à 1 octet alignés, short à 2 octets alignés, et de 4 octets types (int, float, et des pointeurs sur les systèmes 32 bits) à 4 octets aligné.
malloc est requis par la norme de retourner un pointeur qui est aligné correctement pour n'importe quel type de données.
glibc malloc sur x86-64 revient de 16 octets-alignés pointeurs.
très belle explication, en effet. Belle explication. désolé, je ne comprend pas ce que tu veux dire par "il est courant pour le char à 1 octet alignés, court de 2 octets alignés, et de 4 octets types". cela signifie simplement, la plupart des systèmes utilisent couramment 1byte de mémoire pour stocker un char, 2bytes pour stocker court, 4 octets pour int/float/pointeur et ainsi de suite
Si vous avez notamment la mémoire alignemnt besoins (pour du matériel spécifique ou des bibliothèques), vous pouvez consulter la non-mémoire portable allocateurs comme _aligned_malloc() et memalign(). Ceux-ci peuvent facilement être extraites d'un "portable" de l'interface, mais qui sont malheureusement non standard.
[...] the allocated memory that is suitably aligned for any kind of variable.
Qui est vrai pour la plupart tout ce que vous faites en C/C++. Cependant, comme souligné par d'autres, de nombreux cas particuliers existent et nécessitent un alignement particulier. Par exemple, Intel des processeurs 256 bits type: __m256, qui n'est certainement pas pris en compte par les malloc().
De même, si vous souhaitez allouer une mémoire tampon pour les données qui doit être paginé (semblables à des adresses renvoyées par mmap(), etc.) ensuite, vous avez besoin d'un peut-être très grand alignement qui ferait perdre beaucoup de mémoire si malloc() était de retour tampons toujours aligné à ces frontières.
Sous Linux ou d'autres systèmes Unix, je vous suggère d'utiliser le posix_memalign() fonction:
int posix_memalign(void **memptr, size_t alignment, size_t size);
C'est la plus actuelle de la fonction que l'on veut utiliser pour de tels besoins.
L'alignement exigences de préciser quelle est l'adresse à des décalages peuvent être attribués à quels types. Ce qui est totalement dépendant de l'implémentation, mais est généralement basée sur la taille de mot. Par exemple, certaines architectures 32 bits exiger de tous les
int
variables de démarrer sur un multiple de quatre. Sur certaines architectures, l'alignement des exigences absolues. Sur d'autres (par exemple x86) se moquer d'eux vient seulement avec une perte de performance.malloc
est tenu de retourner une adresse convenable pour tout alignement exigence. En d'autres termes, le retour de l'adresse peut être attribué à un pointeur de type quelconque. De C99 §7.20.3 (fonctions de gestion de Mémoire):OriginalL'auteur Matthew Flaschen
Supposons que vous disposez de la structure.
Sans alignement, il serait jeté dans la mémoire (en supposant une architecture 32 bits):
Le problème est que sur certaines architectures des processeurs, les instructions pour charger un entier de 4 octets à partir de la mémoire ne fonctionne que sur les limites de word. Ainsi, votre programme devra aller chercher chaque moitié de
b
avec des instructions distinctes.Mais si la mémoire a été définie comme:
L'accès à
b
devient simple. (L'inconvénient est que plus de mémoire est nécessaire, parce que des octets de remplissage.)Différents types de données ont différentes exigences alignement. Il est commun pour
char
à 1 octet alignés,short
à 2 octets alignés, et de 4 octets types (int
,float
, et des pointeurs sur les systèmes 32 bits) à 4 octets aligné.malloc
est requis par la norme de retourner un pointeur qui est aligné correctement pour n'importe quel type de données.glibc
malloc
sur x86-64 revient de 16 octets-alignés pointeurs.Belle explication.
désolé, je ne comprend pas ce que tu veux dire par "il est courant pour le char à 1 octet alignés, court de 2 octets alignés, et de 4 octets types".
cela signifie simplement, la plupart des systèmes utilisent couramment 1byte de mémoire pour stocker un char, 2bytes pour stocker court, 4 octets pour int/float/pointeur et ainsi de suite
OriginalL'auteur dan04
Si vous avez notamment la mémoire alignemnt besoins (pour du matériel spécifique ou des bibliothèques), vous pouvez consulter la non-mémoire portable allocateurs comme
_aligned_malloc()
etmemalign()
. Ceux-ci peuvent facilement être extraites d'un "portable" de l'interface, mais qui sont malheureusement non standard.OriginalL'auteur André Caron
La
malloc()
documentation dit:Qui est vrai pour la plupart tout ce que vous faites en C/C++. Cependant, comme souligné par d'autres, de nombreux cas particuliers existent et nécessitent un alignement particulier. Par exemple, Intel des processeurs 256 bits type:
__m256
, qui n'est certainement pas pris en compte par lesmalloc()
.De même, si vous souhaitez allouer une mémoire tampon pour les données qui doit être paginé (semblables à des adresses renvoyées par
mmap()
, etc.) ensuite, vous avez besoin d'un peut-être très grand alignement qui ferait perdre beaucoup de mémoire simalloc()
était de retour tampons toujours aligné à ces frontières.Sous Linux ou d'autres systèmes Unix, je vous suggère d'utiliser le
posix_memalign()
fonction:C'est la plus actuelle de la fonction que l'on veut utiliser pour de tels besoins.
OriginalL'auteur Alexis Wilke