Dynamique aligné allocation de la mémoire en C++11
posix_memalign
et _aligned_malloc
sur Windows permettant d'allouer dynamiquement un alignées partie de la mémoire. Est-il rien de semblable dans C++11? Autant que je sache, le alignas
mot-clé ne fonctionne qu'avec allouée statiquement objets.
- Par aligné voulez-vous dire séquentielle ? Si oui, la mémoire allouée avec la combinaison de
new
opérateur et[]
dynamique est aligné. - Aligné est en quelque sorte l'opposé de la séquentiel...
- Je ne dirais pas "en face". Plus comme "orthogonale"?
- Par alignés je veux dire que l'adresse modulo la valeur spécifiée est de zéro. Par exemple l'appel posix_memalign(&ptr, 32, 1000) garantit que l'adresse retournée dans le ptr est divisible par 32. J'ai besoin de ça pour l'allocation des objets à la ligne de cache limites pour éviter les faux partage.
- J'ai peur qu'il n'y a pas de standard C++ allocateur de soutien arbitraire des alignements. Vous devez aller pour plate-forme spécifique de la répartition de l'Api. Mais cela ne devrait pas être un problème si vous l'utilisez en combinaison avec le constructeur/destructeur-sur-arbitraire-mémoire de l'exemple que je vous ai donné.
- Généralement, l'alignement est utilisé pour faire correspondre les exigences matérielles. Cela signifie que les bits de poids faibles du pointeur sont tous 0. L'alignement de 64 octets 256 octets, 4KiBytes, ou 64KiB octets n'est pas rare.
- C++17 ajoutera la possibilité de spécifier des "personnalisé" /sur-alignement pour les objets alloués dynamiquement: open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3396.htm Cette proposition mentionnée dans la réponse sommet a été accepté dans le prochain Standard.
Vous devez vous connecter pour publier un commentaire.
Cela dépend de ce que l'alignement dont vous avez besoin. Pour tout ce <= à
alignof(std::max_align_t)
,new
fonctionne comme par n3242 3.7.4.1/2:std::max_align_t
est un type d'objet avec la plus stricte fondamentaux de l'alignement.Remarque que la répartition des tableaux de
char
ouunsigned char
mais passigned char
ont une règle différente dans 5.3.4/10:Donc
new char[1];
peut avoir un alignement de 1.Comme pour l'allocation de mémoire avec un alignement de plus de
alignof(std::max_align_t)
, C++11 fournit pas de moyen direct pour ce faire. Le seul moyen fiable est d'allouer au moinssize + alignment
octets et l'utilisation std::aligner pour obtenir un alignement correct de l'emplacement dans ce tampon.Cela peut faire perdre beaucoup de mémoire, donc si vous avez besoin d'un grand nombre de ces, vous pouvez créer un allocateur qui alloue un morceau assez grand pour tous, et d'utiliser std::aligner sur que. Vos frais généraux sont ensuite amortis sur toutes les allocations.
Votre autre option est d'attendre pour http://open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3396.htm pour en faire la norme.
Personnellement, je voudrais juste écrire une couche d'abstraction sur le système d'exploitation fourni des Api pour l'attribution des aligné mémoire.
Vous pouvez utiliser posix_memalign/_aligned_malloc d'allouer un morceau de la mémoire, puis à l'aide de la "nouvelle" opérateur syntaxe pour initialiser un objet dans cette zone de mémoire. Quelque chose comme ceci:
malloc
etnew
devrait fonctionner. Le_aligned_malloc
est parce que MS/Intel a présenté au cours de alignée types et a couru dans des problèmes. Plutôt que la fixation desmalloc
, et le risque de rupture de l'ancien code, nous avons obtenu_aligned_malloc
.C++03 et C++0x ont
operator new
.new T
ounew T[]
garanties de retour à aligner correctement la mémoire pour un objet de type T.new char[]
,new signed char[]
etnew unsigned char[]
garantie de retour de mémoire est correctement aligné pour tout objet, de sorte que vous pouvez utiliser le placement de nouveau sur elle.std::max_align_t
type destd::malloc
est garanti à mémoire de retour au moins aligné sur celui de l'alignement. Une mise en œuvre peut se sentir libre de retourner plus de l'alignement.Prendre un coup d'oeil à
std::aligned_storage
et laalignas()
de l'opérateur. Ils font partie de C++11, et semblent être exactement ce que vous cherchez.std::aligned_storage
. Donc ce n'est pas de portable non plus.Pour alignées mémoire allouée sur le tas j'utilise aligner() de la mise en œuvre de http://code.google.com/p/c-plus/source/browse/src/util.h#57, parce que mon gcc4.8 semble pas en charge. Voici un exemple de code:
Intel TBB fournit un portable
cache_aligned_allocator
, je pense que vous pouvez être ce que vous cherchez.La Norme C++ a toujours garanti adapté à l'alignement pour les tout objet à partir d'allocations de tas - qui est,
est la garantie de ne pas l'échec pour l'alignement des raisons.
alignof(std::max_align_t)
. Voir 3.7.4.1p2 (ou 5.3.4p10) et 3.11p2. C'est, l'objet doit avoir des "fondamentaux de l'alignement".