Есть ли путь к posix_memalign станд.:: вектор, не создавая локальный экземпляр вектора сначала? Проблема, с которой я встречаюсь, состоит в том, что я должен сказать posix_memalign, сколько пространства для выделения и я не знаю, как сказать
sizeof(std::vector<type>(n))
на самом деле не создавая новый вектор.
Спасибо
Ну, здесь есть два размера . Сам вектор
обычно представляет собой не более чем один или два указателя на некоторую выделенную память и целые числа без знака, отслеживающие размер и емкость. Есть также и сама выделенная память, что, я думаю, вам и нужно.
Что вы хотите сделать, так это создать собственный распределитель, который будет использовать вектор
. Когда придет время, он будет использовать ваш распределитель, и вы можете иметь свои собственные специальные функции. Я не буду вдаваться в подробности распределителя, а буду вдаваться в подробности:
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
Но повторим первую мысль, размер вектор
одинаков независимо от того, сколько элементов он содержит, поскольку он указывает только на буфер. Меняется только размер этого буфера.