2009-11-25 46 views
0

我在寫一段需要對象互相交換消息的軟件。 這些消息必須有下列內容:C++消息傳遞的疑惑

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

現在,同行中已是一個指針,因爲我有一個管理同行其他類。對於其餘的我很懷疑......例如,我可以在創建消息時複製消息文本和有效負載(通過分配兩個新緩衝區),然後將刪除消息放入消息的析構函數中。這具有避免忘記在消費者功能中的刪除(不提及使這些功能更簡單)的巨大優點,但它會導致許多副本的分配並且可以使一切變得緩慢。因此,我可能只是指出指針,並仍然有析構函數刪除eveything ...或者......這是一個普遍的情況,在其他編程語言甚至不是一個困境,因爲有一個GC。你有什麼建議?最受歡迎的做法是什麼?

編輯: 我的意思是我想知道傳遞內容的最佳實踐是什麼......就像有另一個跟蹤它們的對象,或者可能共享指針......或者你會做什麼...

回答

1

如果所有消息都相似,請考慮使用垃圾堆棧(http://library.gnome.org/devel/glib/stable/glib-Trash-Stacks.html) - 這樣,您可以保留一堆已分配但尚未初始化的消息結構,您可以重複使用而不必使用常量malloc /免費擊中。

+0

我擔心的不是分配消息......而是內容傳遞。什麼是最好的策略......我會修改我的問題。 – gotch4

2

您需要清除ownership:當消息在對等點之間傳遞時,所有權是否更改?如果您切換所有權,請讓接收機進行清理。

如果你只是「租賃」一條消息,確保有一個「返回所有者」程序。

消息是否共享?那麼你可能需要一些複製有互斥體來保護訪問。

+0

@ gotch4:我的回答能讓你滿意嗎? – jldupont

0

考慮使用shared_ptr<>,它可以從Boost獲得,也可以是std::tr1庫的一部分,而不是原始指針。在所有情況下使用它並不是最好的,但看起來你想保持簡單並且非常好。它是本地引用計數垃圾收集。

0

在C++中沒有任何規則甚至是最佳實踐,除非您做出關於指針所有權的設計決定並堅持它。

您可以嘗試通過使用智能指針來執行特定策略,或者您可以簡單記錄所設計的行爲,並希望每個人都閱讀手冊。

0

在C++中,你可以有引用計數也喜歡這裏:

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

在這種情況下,你可以通過油嘴:: RefPtr對象。當這些RefPtr-s中的最後一個與指針相關聯被銷燬時,該對象本身被刪除。

如果你不想使用glibmm,你也可以實現它,這不是太困難。另外,可能STL和boost也有類似的東西。

只要注意循環引用。

0

最簡單的做法是使用對象來管理緩衝區。例如,您可以將std::string用於msgText和​​成員,您可以使用payLoadLen,因爲payload.size()方法將處理此問題。

當且僅當你衡量這個解決方案的性能和複製msgText和​​的行爲是造成不可接受的性能損失,您可以選擇使用共享指針,是由消息副本共享結構。

在幾乎沒有任何情況下,我會依賴記住在析構函數中調用delete或手動編寫安全的複製賦值操作符和複製構造函數。

0

最簡單的政策是處理複製整個郵件(深層複製)並將該副本發送給收件人。它將需要更多的分配,但它可以讓你擺脫許多與併發訪問數據有關的問題。如果性能變得苛刻,仍然有一些優化的空間(如避免拷貝,如果對象只有一個所有者願意在發送它時放棄它的所有權)等。

然後每個擁有者負責清理消息對象。

+0

嗯...聽起來像一個懶惰的方法給我。 – jldupont

+0

是的,與使用java代替彙編程序相同:擴展一個抽象層以擺脫大量問題。 Erlang使用這種方法取得了巨大的成功。 –