posix_memalign для std::vector

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

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

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

Спасибо


person Opt    schedule 26.02.2010    source источник


Ответы (1)


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

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

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 одинаков независимо от того, сколько элементов он содержит, поскольку он указывает только на буфер. Меняется только размер этого буфера.

person GManNickG    schedule 26.02.2010