posix_memalign для std :: vector - PullRequest
       23

posix_memalign для std :: vector

7 голосов
/ 26 февраля 2010

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

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

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

Спасибо

1 Ответ

10 голосов
/ 26 февраля 2010

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

...