2010-02-26 3 views
6

Есть ли способ создать posix_memalign вектор std :: без создания локального экземпляра вектора? Проблема Я сталкиваюсь в том, что я должен сказать posix_memalign, сколько места выделить и я не знаю, как сказатьposix_memalign for std :: vector

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

без фактического создания нового вектора.

Thanks

ответ

9

Ну, здесь два размера. Сам vector обычно представляет собой не более чем указатель или два для некоторой выделенной памяти, а целые числа без знака, отслеживающие размер и емкость. Существует также выделенная память, которая, как я думаю, вам нужна.

Что вы хотите сделать, это сделать собственный распределитель, который будет использовать vector. Когда придет время, он будет использовать ваш распределитель, и у вас могут быть свои собственные специальные функции. Я не пойду по full details из в распределителе, но специфика:

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

    // ... 
}; 

И тогда вы бы использовать его как:

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

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

Но повторить первую точку, размер vector - это то же самое, независимо от того, сколько элементов оно удерживает, поскольку оно указывает только на буфер. Изменяется только размер этого буфера.