7

最初にベクターのローカルインスタンスを作成せずに、std :: vectorをposix_memalignする方法はありますか?私が直面している問題は、posix_memalignに割り当てるスペースの量を指示する必要があり、言い方がわからないことです。

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

実際に新しいベクトルを作成せずに。

ありがとう

4

1 に答える 1

10

さて、ここには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保持している要素の数に関係なく同じです。これは、バッファーを指しているだけだからです。そのバッファのサイズのみが変更されます。

于 2010-02-26T08:33:02.897 に答える