問題タブ [qshareddata]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 前方宣言されたクラスを持つ QSharedDataPointer
Qtのドキュメントでは、下位の可視実装で QSharedDataPointer を使用することは一般的ではないことが示唆されています。
したがって、ドキュメントで切り取られた小さな例によると、次のソース (SSCCE) を思いつきました。
インターフェース: Model.h
インターフェイスは単純明快で、private クラスとハンドル クラスの前方宣言だけで、copy-ctor と d-tor が宣言されています。
プライベート ヘッダー: Model_p.h
下位クラスを宣言して定義するだけです。
実装: Model.cc
ドキュメントから取得した c-tors/d-tor の実装で構成されています。
ユースケース: main.cc
すべてが失敗した場所。
他の共有クラスと同様に、2 つのインスタンスと 1 つの割り当てだけです。しかし、それはひどく失敗します
ドキュメントによると、これを期待どおりに機能させる方法、つまりヘッダーでプライベートクラスを完全に宣言する方法がわかりません。そうするときに機能することは知っていますが、ドキュメントを理解したいと思います。共有クラスを割り当てる例もドキュメントに含まれています。上記のリンクのドキュメントから:
クラス EmployeeData はクラス Employee (employee.h) と同じファイルに含まれているため、ここではコピー コンストラクターは厳密には必要ありません。ただし、QSharedDataPointer を含むパブリック クラスと同じファイルに QSharedData のプライベート サブクラスを含めることは一般的ではありません。通常、QSharedData のプライベート サブクラスを、パブリック ファイルには含まれない別のファイルに配置することで、ユーザーから隠します。この場合、通常はクラス EmployeeData を別のファイルに配置しますが、これは employee.h には含まれません。代わりに、employee.h でプライベート サブクラス EmployeeData を次のように事前宣言します。
operator=
を割り当てるときに使用されるでコンパイルが失敗すると思いますModel
。
c++ - Qt での暗黙的な共有の概念についての混乱
次の例の暗黙的な共有の概念によれば、Windows タスク マネージャーのメモリ使用量が少なくなるはずです。
クラスからforループで1000000オブジェクトを作成し、作成されたオブジェクト間でEmployee
内部データ(EmployeeData
クラス)を共有する場合があります。
***
: Qt ドキュメントQSharedDataPointerに従って言及された行のコメントを外すと、共有データから切り離され、独自のコピーが作成されますEmployeeData
。
EmployeeData
およびEmployee
クラス:
プラットホーム:Windows 10
Qt バージョン:5.7
コンパイラ:MSVC 2015 32bit
結果は次のとおりです(タスクマネージャーから):
- リリース: 40M RAM 使用量
- デバッグ: 189M RAM 使用量
質問:
提供されたループの想定EmployeeData
サイズに基づいて12
、1 つのインスタンスを作成し、EmployeeData
それを別の 999,999 オブジェクト インスタンスと共有する必要があるため、メモリ使用量を少なくとも 3M 未満に削減する必要があります。よろしいですか?
次の行のコメントを外すと、 の 1000,000 個の一意のインスタンスを作成する必要がEmployeeData
あるため、インスタンスによって使用されるメモリが増加します。それでよろしいですか?
c++ - QSharedData の継承されたクラスで明示的にデストラクタを宣言する必要がありますか?
私の質問は、メモリ リークを防ぐために、メイン クラスと QSharedData の継承されたクラスで明示的にデストラクタを宣言する必要があるかどうかに関するものです。この例では、EmployeeData を介してデータを処理する Employee クラスがあります。
だから私は宣言する必要がありますか
と
従業員がスコープ外になったときに、メモリリークを防ぐか、明示的なデストラクタがなくてもすべてのリソースの割り当てを解除する QSharedData 自体によって処理されますか?
ここに実装されている例があります:
前もって感謝します