最初にベクターのローカルインスタンスを作成せずに、std :: vectorをposix_memalignする方法はありますか?私が直面している問題は、posix_memalignに割り当てるスペースの量を指示する必要があり、言い方がわからないことです。
sizeof(std::vector<type>(n))
実際に新しいベクトルを作成せずに。
ありがとう
最初にベクターのローカルインスタンスを作成せずに、std :: vectorをposix_memalignする方法はありますか?私が直面している問題は、posix_memalignに割り当てるスペースの量を指示する必要があり、言い方がわからないことです。
sizeof(std::vector<type>(n))
実際に新しいベクトルを作成せずに。
ありがとう
さて、ここには2つのサイズがあります。それvector
自体は通常、割り当てられたメモリへのポインタまたは2つにすぎず、符号なし整数はサイズと容量を追跡します。割り当てられたメモリ自体もあります。これは私が望むものだと思います。
あなたがしたいのは、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
ただし、最初のポイントを繰り返すと、aのサイズは、vector
保持している要素の数に関係なく同じです。これは、バッファーを指しているだけだからです。そのバッファのサイズのみが変更されます。