2010-08-25 21 views
4

Vous pouvez affecter un vecteur std :: qui alloue la mémoire de tas alignée en définissant votre propre allocateur. Vous pouvez allouer un tableau de style c sur la pile à l'aide de l'instruction declspec align. Mais pouvez-vous déclarer un tableau tr1 :: qui garantit que l'élément à l'index zéro sera aligné?Comment faire pour que tr1 :: array alloue la mémoire alignée?

+0

Comment aligné avez-vous besoin de la mémoire pour être? L'implémentation s'assure généralement que tous les objets sont alignés. L'exception concerne les types "spéciaux", tels que les vecteurs SSE, qui nécessitent un alignement de 128 bits. – jalf

+0

Oui: de nouvelles garanties que la mémoire retournée sera correctement alignée (tant que la mémoire demandée est assez grande pour contenir l'objet). Ainsi, vector/Array et toute mémoire allouée dynamiquement sont garantis pour être alignés avec votre objet (tant que la taille de la mémoire allouée est égale ou supérieure à votre objet). –

Répondre

7

tr1::array (et std::array et boost::array) sont POD, de sorte que la mémoire occupée par le contenu coïncide avec la mémoire du array. Donc, allouez le array comme vous le souhaitez, et construisez-le avec l'emplacement new.

typedef std::tr1::array< MyClass, ary_sz > AryT; 
void *array_storage = aligned_allocation(sizeof(AryT)); 
AryT *ary = new(array_storage) AryT(initial_value); 
+0

Pourriez-vous s'il vous plaît montrer un exemple? –

+0

@zr: à peine dit plus que fait;) – Potatoswatter

+0

@PS: Merci beaucoup pour une réponse rapide et précise. –