posix_memalign для станд.:: вектор

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

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

на самом деле не создавая новый вектор.

Спасибо

7
задан Opt 26 February 2010 в 08:25
поделиться

1 ответ

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

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

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

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

10
ответ дан 7 December 2019 в 01:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: