4

ベクトルのストレージを (たとえば 16 バイト境界に) 整列させたいので、このアロケータを へのラッパーとして持っていますmemalign()。これが、STL ベクトルで使用される整列メモリを割り当てる正しい方法であるかどうか疑問に思っています。

template <class T , int Alignment=16>
class AlignedAllocator
{
public:
...

    pointer allocate (size_type size, const_pointer *hint = 0) {
        return (pointer) memalign(Alignment, size*sizeof (T));
    };

    void deallocate (pointer p, size_type size) {
        free(p);
    };
...
}

そうでない場合、STL コンテナーで動作する整列アロケーターの利用可能な実装はありますか?

PS: gcc でコンパイルしています。

4

3 に答える 3

1

関数 memalign(3) は廃止されました。代わりにposix_memalign(3)を使用してみてください。それ以外は、...コード内の が必要なアロケーター要素の残りを含むことを意味すると仮定すると、コードは見栄えがします。

于 2012-07-22T16:01:52.117 に答える
0

これはベクターの実装に依存します。少し大きいバッファーを割り当て、データの前にアライメントを壊すものを追加することを選択する場合があります。

于 2012-07-22T16:15:24.953 に答える
0

いいね。しかし、そのようなコードをBSDとDarwinに移植する際に問題が発生します。割り当て関数を手動で作成する方がはるかに堅牢です。

ちょうど新しい十分な大きさのブロックと整列されたポインタを返します。また、カスタムの割り当て解除関数を作成する必要があります

于 2012-07-22T14:23:07.483 に答える