2

stxxlFAQで、私はこれを見つけました:

STXXL コンテナーのパラメーター化

stxxl::vector のような STXXL コンテナ型は、POD である値型 (つまり、仮想関数、ユーザー定義のコピー代入/デストラクタなど) でのみパラメーター化でき、内部メモリへの参照 (ポインターを含む) を含みません。 . 通常、「複雑な」データ型はこの要件を満たしていません。

stxxl::vector<std::vector<T> >これが、と stxxl::vector<stxxl::vector<T> >が無効な理由です。必要に応じて、 を使用する std::vector<stxxl::vector<T> >か、インデックス計算を行って 2 次元配列をエミュレートします。

コンテナは、コンテナのサイズ変更時に含まれる要素のコンストラクタまたはデストラクタを呼び出さないため、使用できないことは完全にstxxl::vector<std::vector<T> >理にかなっています。stxxlしかし、次のような構造体を格納するにはどうすればよいでしょうか。

struct S {
    int* a;
}

aが指すオブジェクトがインスタンスが存在する限り有効であることを保証する場合、これをstxxl::vector<S>に格納する際の問題は何ですか? の特定のインスタンスをディスクに移動する必要がある場合、ポインタの値がディスクに書き込まれます。後で、ポインター値が復元され、使用できるようになります。明らかに、ポインター値はマシン依存であり、インスタンス依存でもありますが、これは、ポイントされたオブジェクトの有効期間を処理しても問題でしょうか? シリアル化されたオブジェクトをソケット経由で送信していません。また、シリアル化されたオブジェクトを後で使用するためにデータベースに保存していません。structstxxl::vector<S>Sa

何か不足していますか?

編集:誰かがポインティをコピーしないことを思い出させたので、後でstxxlのインスタンスを取得すると、ガベージへのポインターを取得する可能性があります。struct Sそんなこと知ってる。ポインティがプログラムの存続期間全体にわたって有効であることを保証します。

4

3 に答える 3

5

(ポインタを含む) 内部メモリへ

これは、構造体のメンバーへのポインター、またはコンテナーが管理するメモリへのポインターを意味します。たとえば、あなたが持っている

struct Foo {
     int *a;
     int b;
};

Foo f;
f.a = &f.b

f.a現在、構造体のメンバーを指しており、その構造体がコピーされる可能性があるため、ポインターが無効になる可能性があります。同様に、ポインターがコンテナーによって管理される他の構造体 Foo を指している場合、これも移動できます。

ポインターがあり、それが指すものを管理するだけであれば、問題ありません。

于 2014-02-24T14:42:19.920 に答える
1

厳密なポインターの安全性を備えた実装では、ポインターをディスクに保存したという事実は不十分です。そのポインタがメモリ内に存在しなくなった場合、それが指すオブジェクトは有効ではなくなります。ディスクからポインタ ビットを復元したとしてもです。特に、dtor を実行せずにガベージ コレクションされた可能性があります。

于 2014-11-27T12:26:37.940 に答える