0

相互にメッセージを交換するオブジェクトを必要とするソフトウェアを作成しています。メッセージには次の内容が含まれている必要があります。

Peer *srcPeer;
const char* msgText;
void* payload;
int payLoadLen;

Peer を管理する別のクラスがあるため、Peer はポインタでなければなりません。残りについては疑わしいです...たとえば、メッセージが作成されるときにメッセージテキストとペイロードをコピーし(2つの新しいバッファーを割り当てることにより)、メッセージのデストラクタに削除を配置します。これには、コンシューマー関数の削除を忘れるのを避けるという大きな利点があります (これらの関数を単純にするという言及ではありません) が、多くの割り当てとコピーが発生し、すべてが遅くなる可能性があります。したがって、ポインターを代入するだけで、デストラクタにすべてを削除させることができます...または...まあ、これは他のプログラミング言語ではGCがあるためジレンマでさえない一般的な状況です。あなたの提案は何ですか?また、最も一般的なプラクティスは何ですか?

編集:コンテンツを渡すためのベストプラクティスは何かを知りたいということです...それらを追跡する別のオブジェクト、またはおそらく共有ポインターを使用するなど...またはあなたは何をしますか...

4

7 に答える 7

2

明確にする必要がありownershipます: メッセージがピア間で渡されるとき、所有権は変更されますか? 所有権を切り替える場合は、受信者にクリーンアップを依頼してください。

メッセージを「リース」するだけの場合は、必ず「所有者に返す」手続きを行ってください。

メッセージは共有されていますか? 次に、アクセスを保護するために、おそらくいくつかのコピーが必要になる、ミューテックスが必要になります。

于 2009-11-25T17:52:29.607 に答える
1

すべてのメッセージが類似している場合は、ごみ箱スタック ( http://library.gnome.org/devel/glib/stable/glib-Trash-Stacks.html )の使用を検討してください。一定の malloc/free ヒットを取得せずに再利用できる、まだ初期化されていないメッセージ構造。

于 2009-11-25T17:51:53.260 に答える
0

生のポインターではなく、shared_ptr<>Boost から入手でき、ライブラリの一部でもある の使用を検討してください。std::tr1すべての場合に使用するのが最善というわけではありませんが、物事をシンプルに保ちたいようで、それが非常に得意です。これは、ローカル参照カウント ガベージ コレクションです。

于 2009-11-25T17:53:42.970 に答える
0

ポインターの所有権について設計上の決定を下し、それに固執する場合を除いて、C++ にはこれに関するルールやベスト プラクティスさえありません。

スマート ポインターを使用して特定のポリシーを強制することもできますし、単に設計された動作を文書化して、すべての人にマニュアルを読んでもらうこともできます。

于 2009-11-25T17:54:13.380 に答える
0

C++ では、次のように参照カウントも行うことができます。

http://library.gnome.org/devel/glibmm/stable/classGlib_1_1RefPtr.html

この場合、Glib::RefPtr オブジェクトを渡すことができます。これらの RefPtr の最後のものがポインターに関連付けられて破棄されると、オブジェクト自体が削除されます。

glibmm を使用したくない場合は、実装することもできます。それほど難しくありません。また、おそらくSTLやboostにもこのようなものがあります。

循環参照に注意してください。

于 2009-11-25T17:56:11.847 に答える
0

最も簡単なのは、オブジェクトを使用してバッファを管理することです。たとえば、とメンバーstd::stringの両方に を使用し、メソッドによって処理されるため、 をなくすことができます。msgTextpayloadpayLoadLenpayload.size()

このソリューションのパフォーマンスと、 をコピーする行為が許容できないパフォーマンス ヒットを引き起こしている場合にのみmsgTextpayloadメッセージのコピーによって共有された構造体への共有ポインターを使用することを選択できます。

deleteデストラクタを呼び出したり、安全なコピー代入演算子とコピー コンストラクタを手動で記述したりすることを忘れないでください。

于 2009-11-25T17:56:16.450 に答える
0

対処する最も簡単なポリシーは、メッセージ全体をコピー (ディープ コピー) し、そのコピーを受信者に送信することですより多くの割り当てが必要になりますが、データへの同時アクセスに関連する多くの問題から解放されます。パフォーマンスが重要になった場合でも、いくつかの最適化の余地があります (オブジェクトを送信するときに所有権を放棄しても構わないと思っている所有者が 1 人しかいない場合、コピーを避けるなど)。

各所有者は、メッセージ オブジェクトをクリーンアップする責任があります。

于 2009-11-25T17:57:52.683 に答える