2012-11-14 53 views
5

यह अजीब लग सकता है, लेकिन मैं इसे तर्कसंगत बनाने की कोशिश करूंगा। मैं वर्तमान में shared_ptr साथ संयोजन के रूप में बड़े पैमाने पर boost.object_pool उपयोग करें, और हाल ही में मैं एक स्थिति है कि मैं वर्तमान कार्यक्रम राज्यों की फोटो लेने की जरूरत का सामना करना पड़ा है, ताकि पूर्ण पैमाने पर पुनरावृत्ति/रोलबैक/तेजी से आगे की तरह कार्यक्षमता बनाने के लिएसी या सी ++ में कोई क्लोनबल ऑब्जेक्ट पूल कार्यान्वयन?

इसलिए मैं किसी ऑब्जेक्ट पूल को कहीं और उपयोग करने के लिए क्लोन करने की कोशिश नहीं कर रहा हूं, जो स्पष्ट रूप से काम नहीं करेगा क्योंकि अगर मुझे boost.pool के इंटरफ़ेस (जो मैं नहीं हूं) द्वारा ऐसा करने की अनुमति है, तो कोई मान्य नहीं होगा पॉइंटर्स उस नए क्लोन पूल में भाग को इंगित करते हैं और यह केवल व्यर्थ होगा। लेकिन यहां मेरा उपयोग का मामला है कि मैं पेस्ट "रीप्ले/रोलबैक की ज़रूरतों के साथ मूल पूल में वापस आना चाहता हूं।

मैं निश्चित रूप से बस सभी राज्यों, वस्तुओं, और उप-राज्यों, उप-वस्तुओं और सबबब को कॉपी और क्लोन कर सकता हूं ... मैन्युअल रूप से और फिर उन्हें स्नैपशॉट में पैक कर सकता हूं, और उम्मीद है कि सब ठीक हो जाएगा, लेकिन यह त्रुटि है- प्रोजेक्ट को पहले से ही मिली जटिलता दी गई है, और अगर मैं सिर्फ स्मृति को कॉपी कर सकता हूं तो यह बहुत धीमी होनी चाहिए। पूर्ववत-रेडो प्राप्त करने के लिए कमांड पैटर्न (या जैसे) का उपयोग करना प्रश्न से काफी सुंदर है क्योंकि पूर्ववत-पूर्व तंत्र मेरा इरादा नहीं है।

मैं सोच रहा था कि क्या मैं एक मर-हार्ड पारंपरिक-सी तरीके से फिर से स्क्रैच से प्रोजेक्ट करता हूं, और एक साधारण memcpy (स्नैपशॉट, all_states, आकार) कॉल लगभग सभी काम करेगा।

क्या कोई अन्य विकल्प है जिसे मैं अभी भी याद कर रहा हूं? क्या कोई boost.object_pool कार्यान्वयन की तरह है जो आपको अंतर्निहित स्मृति क्षेत्र को क्लोन करने की अनुमति देता है? स्थिति पर विचार कर एक व्यावहारिक विकल्प boost.object_pool घुसपैठ कर रहा है?

+0

एक समान इंटरफेस के साथ अपना खुद का, कॉपी करने योग्य, ऑब्जेक्ट पूल लिखना _too_ कठिन या समय लेने वाला प्रतीत नहीं होता है। – Pubby

+0

@ पब्बी: ग्राफ-जैसी संरचनाएं क्लोन करना कभी आसान नहीं होती हैं। सबसे आम गलतियां एक अनंत चक्र में फंस रही हैं और अनजाने में ग्राफ को तोड़ रही हैं। यह भी डीबग करना नरक है। –

उत्तर

2

मुझे नहीं पता कि मुझे पता है।

जैसा कि आपने देखा है, यहां मुख्य मुद्दा उन वस्तुओं के बीच संभावित अंतर-निर्भरताओं की उपस्थिति है, जिन्हें आप प्रतिलिपि बनाते समय पॉइंटर्स को अपडेट करने की आवश्यकता होती है। निश्चित रूप से गैर-तुच्छ।

मैं दो संभव समाधान के बारे में सोच सकते हैं:

  • Persistency
  • क्रमबद्धता

Persistency के बारे में कभी नहीं मौजूदा राज्य परिवर्तनशील है। जब आप राज्य बदलते हैं, तो आप इस प्रकार एक नया स्नैपशॉट बनाते हैं जो नए बिट्स को छोड़कर पुराने राज्य को संदर्भित करता है। यह आमतौर पर डेटाबेस के एमवीसीसी कार्यान्वयन में उपयोग किया जाता है, उदाहरण के लिए, और कार्यात्मक प्रोग्रामिंग दुनिया में व्यापक है। यदि आप कोशिश करते हैं और बहुत सारे संदर्भ रखते हैं तो स्पेस लीक प्राप्त करने का भी एक अच्छा तरीका है। अंत में, इसे एक गहरी पुन: इंजीनियरिंग की आवश्यकता है।

सीरियलाइजेशन स्थायी स्थिति के बारे में है, लेकिन एक अलग प्रारूप में है। आप अपने वर्तमान स्थिति को धारावाहिक प्रारूप (चाहे पाठ या बाइनरी) में डंप करें, और आप धारावाहिक बफर को पढ़कर इसे फिर से बनाने में सक्षम हैं। आप कुछ स्मृति को छोड़ने के लिए धारावाहिक बफर पर एक संपीड़न पास भी लागू कर सकते हैं।

चूंकि आप पहले से बूस्ट का उपयोग कर रहे हैं, तो जानने के लिए कि Boost.Serialization स्वचालित रूप से वस्तुओं के रेखांकन संभाल (हाँ!) और मैं पहले से ही boost::shared_ptr साथ सही ढंग से संबंधित है लगता है खुशी। यह यहां आपका सबसे अच्छा विकल्प हो सकता है।