c++ - Struct of vectors in Shared Memory -
मेरे पास संरचना है:
struct out डेटा {int a; फ्लोट अक्षांश, लोन; } जो साझा स्मृति के द्वारा आईपीसी के लिए प्रयोग किया जाता है अब मैं इसे इस तरह से देखने के लिए अपडेट करना चाहता हूं:
struct out डेटा {int a; Std :: vector & lt; std :: जोड़ी & lt; std :: स्ट्रिंग, इंटीट & gt; & gt; allInts; Std :: vector & lt; std :: जोड़ी & lt; std :: स्ट्रिंग, फ्लोट & gt; & gt; allfloats; } मेरी साझा स्मृति 4096 बाइट्स convienience के लिए बड़ी है, इसलिए मुझे हर बार जब मैं struct में परिवर्तन करता है तो एक sizeof (outData) लाइन को संशोधित नहीं करना पड़ता है।
जब मैं गतिशील सदस्यों के साथ इस तरह के एक स्ट्रक्चर का निर्माण करता हूं तो क्या यह गारंटी है कि वे सभी (इंट ए) के बाद बनाए गए हैं और इसलिए साझा स्मृति में?
वैक्टर के वैक्टर के बारे में क्या ? <पूर्व> स्ट्रेट आउटडेटा {int a; Std :: vector & lt; std :: जोड़ी & lt; std :: स्ट्रिंग, इंटीट & gt; & gt; allInts; Std :: vector & lt; std :: जोड़ी & lt; std :: स्ट्रिंग, फ्लोट & gt; & gt; allfloats; Std :: vector & lt; std :: pair & lt; std :: स्ट्रिंग, std :: vector & lt; बाइट & gt; & gt; & gt; allByteMessages; } तेज उत्तर के लिए वाह धन्यवाद! आपके इनपुट के आधार पर मैंने इस समाधान को पूरा किया:
struct out डेटा {int * iarray; फ्लोट * फ़ॉर्रे; } GtempStruct; SetSharedMem (std :: vector & lt; std :: pair & lt; int, float & gt; & gt; और amp; इनपुट) {void * p_v; GtempStruct.iarray = नया int [input.size ()]; GtempStruct.farray = नया फ्लोट [input.size ()]; fillStruct (इनपुट); आउटडेटा * p_oD = (आउटडेटा *) p_Shm; // p_Shm = साझा स्मृति साझा करने के लिए संकेतक * p_oD = gtempStruct; P_v = p_oD; P_v = reinterpret_cast & lt; char * & gt; (p_v) + sizeof (outData) -1; P_v = reinterpret_cast & lt; शून्य * & gt; (p_v); Memcpy (p_v, gtempStruct.iarray, sizeof (int) * input.size ()) p_oD- & gt; iarray = (int *) p_v; । । । } यह काम करता है, लेकिन यह पूरी तरह से परीक्षण नहीं किया गया है। धन्यवाद!
यह काम नहीं कर सकता तार साझा स्मृति में नहीं होगा std :: string वस्तु होगी, लेकिन इसकी सामग्री नहीं होगी। std :: vector & lt; बाइट & gt; के लिए भी यही सच है। वेक्टर ऑब्जेक्ट साझा स्मृति में होगा, लेकिन इसकी सामग्री नहीं होगी। इन दोनों वर्गों को पता नहीं है कि जब उनका निर्माण हो तब उनकी सामग्री कितनी बड़ी होगी। इसलिए उनकी स्थैतिक सामग्री में बस उनकी गतिशील सामग्री को खोजने के लिए पर्याप्त जानकारी शामिल है डायनामिक सामग्री को अलग से आवंटित किया जाता है।
यदि आप साझा मेमोरी का उपयोग करने जा रहे हैं, तो आपको बाइट स्तर पर उस साझा मेमोरी की सामग्री को परिभाषित करना होगा। आंतरिक पूर्ण पॉइंटर्स वाले वर्ग काम नहीं करेंगे यदि आपको पॉइंटर्स की आवश्यकता है, तो आपको साझा स्मृति सेगमेंट की शुरुआत के लिए उन्हें सापेक्ष बनाना होगा ताकि वे प्रक्रियाओं में सार्थक हो।
Comments
Post a Comment