1

Result m_result というメンバー変数があるとします。

class Result{
QList<Group *> m_groups
}

とグループ

class Group{
QList<Data> m_data
}

プログラムが進むにつれて、各グループの QList of Data は増え続けます。すべてのグループはヒープに割り当てられます (したがって、ポインター)。基本的に、各グループはヒープに 1 回割り当てられます。特定のグループは、その QList が大きくなるたびに再割り当てされますか? また、m_testResult は Data メンバーの増加のために何度も再コピーされますか?

4

2 に答える 2

7

QList 内には、実際にデータを保持する他のオブジェクトまたは配列へのポインターがあります。リストが大きくなるにつれて、このバッキング データの新しいオブジェクトが割り当てられ、既存のオブジェクトは削除されます。あなたが示したコードはそれについて心配する必要はありませんが、独自のコレクションを実装している場合は心配する必要があります。オブジェクト自体は、一度割り当てられると決して大きくなりません。

QList の詳細については、こちらを参照してくださいへのポインターの配列を使用する<T>ため、リンクされたリストではありません。要素へのポインターを使用するため、配列のサイズが変更されたときに要素をコピーする必要はなく、ポインターをコピーするだけです (または、VListと同様の方法で実装されている場合はそうではない可能性があります- ドキュメントには何も表示されませんでした使用する戦略を示します)、そのため、QList が大きくなるたびに特定のグループが再割り当てされることはありません。

于 2013-02-14T21:03:59.717 に答える
2

具体的にはわかりませんQListが、一般的には次のことを期待しています。

  • 新しい要素を追加すると、 はより多くのメモリをQList割り当て ( new)、最後の要素を新しい要素にリンクします。

  • (既存の) 要素を削除すると、要素の先行要素が後続要素にリンクされ、要素を保持しているメモリが削除されますdelete

  • これは、リンクされたリストがどのように機能するかについての一般原則ですstd::liststd::slist

  • オブジェクトが大きくなることはありませんが、メモリは繰り返し要求および解放できます。

于 2013-02-14T21:05:28.557 に答える