2010-02-26 10 views
6

Existe-t-il un moyen de positionner un vecteur std :: posix_memalign sans créer d'instance locale du vecteur? Le problème que je rencontre est que je dois dire posix_memalign combien d'espace à allouer et je ne sais pas comment direposix_memalign pour std :: vector

sizeof(std::vector<type>(n)) 

sans réellement créer un nouveau vecteur.

Merci

Répondre

9

Eh bien, il y a deux tailles ici. Le vector lui-même n'est généralement pas plus d'un pointeur ou deux à la mémoire allouée, et les entiers non signés gardant la trace de la taille et de la capacité. Il y a aussi la mémoire allouée elle-même, ce que je pense que vous voulez.

Ce que vous voulez faire est de faire un allocateur personnalisé que le vector utilisera. Quand vient le temps, il utilisera votre allocateur et vous pouvez avoir vos propres fonctionnalités spéciales. Je ne reprendrai pas le full details d'un allocateur, mais les détails:

template <typename T> 
struct aligned_allocator 
{ 
    // ... 

    pointer allocate(size_type pCount, const_pointer = 0) 
    { 
     pointer mem = 0; 
     if (posix_memalign(&mem, YourAlignment, sizeof(T) * pCount) != 0) 
     { 
      throw std::bad_alloc(); // or something 
     } 

     return mem; 
    } 

    void deallocate(pointer pPtr, size_type) 
    { 
     free(pPtr); 
    } 

    // ... 
}; 

Et vous voulez l'utiliser comme:

typedef std::vector<T, aligned_allocator<T> > aligned_T_vector; 

aligned_T_vector vec; 
vec.push_back(/* ... */); // array is aligned 

Mais pour réitérer le premier point, la taille d'un vector est la même quel que soit le nombre d'éléments qu'il contient, car il ne pointe que vers un tampon. Seule la taille de ce tampon change.