posix memalign для std:: вектор

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

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

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

спасибо

1 ответов


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