2010-02-26 30 views
6

Czy istnieje sposób na posix_memalign std :: vector bez tworzenia lokalnej instancji wektora? Problem mam napotykając jest to, że muszę powiedzieć posix_memalign ile miejsca przeznaczenia i nie wiem jak to powiedziećposix_memalign dla std :: vector

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

faktycznie bez tworzenia nowego wektora.

Dzięki

Odpowiedz

9

Istnieją dwa rozmiary tutaj. Samo vector jest zwykle nie więcej niż wskaźnikiem lub dwoma do niektórych przydzielonych pamięci i liczb całkowitych bez znaku, śledząc rozmiar i pojemność. Jest też przydzielona sama pamięć, o której myślę, że chcesz.

Co chcesz zrobić, to zrobić niestandardowy przydział, którego użyje vector. Kiedy nadejdzie czas, użyje twojego przydziału i będziesz mieć własną specjalną funkcjonalność. Nie będę się nad full details wystąpienia podzielnika, ale specyfika:

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); 
    } 

    // ... 
}; 

A potem go używać jak:

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

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

Ale powtórzyć pierwszy punkt, wielkości vector jest taki sam, niezależnie od tego, ile elementów trzyma, ponieważ wskazuje tylko na bufor. Zmienia się tylko rozmiar tego bufora.

Powiązane problemy