uint32_t index : 20;
uint32_t magic : 12;
तो यह इस कोड के रूप में ही है?
std::bitset<20> index;
std::bitset<12> magic;
बिल्कुल नहीं, और यह बहुत महत्वपूर्ण है कि आप अंतर को समझते हैं।
सबसे पहले, std :: bitset <> का आंतरिक प्रतिनिधित्व कार्यान्वयन के नीचे है।
जिस तरह से हमें उपरोक्त दो कोड स्निपेट के बीच अंतर की जांच करनी चाहिए।
सी ++ में बिटफील्ड एक अलग वस्तु नहीं है। बहु-थ्रेडेड कोड में इसका महत्वपूर्ण प्रभाव पड़ता है।
ऐसा इसलिए है क्योंकि सी ++ 11 और अधिक गारंटी है कि दो धागे से दो अलग-अलग वस्तुओं तक असुरक्षित पहुंच सुरक्षित है, लेकिन दो और अधिक धागे द्वारा समान गैर-कॉन्स ऑब्जेक्ट का उपयोग डेटा रेस है जब तक कि mutex द्वारा संरक्षित नहीं किया जाता ।
ऊपर bitset
कोड में यह कहना सही होगा:
thread1: index = 10;
thread2: auto x = magic;
क्योंकि वे असतत वस्तुओं और इसलिए इसकी गारंटी जब तक पहुँच डेटा दौड़ पैदा करने के लिए नहीं कर रहे हैं विभिन्न धागे
बिटफील्ड कोड में यह सुरक्षित नहीं होगा। सूचकांक का अद्यतन जादू के पढ़ने के साथ एक दौड़ होगी, और यह अपरिभाषित व्यवहार है।
स्रोत
2016-12-06 15:01:02
आप सही हैं मैं बहु थ्रेडेड निहितार्थ भूल जाते हैं। मुझे पता है कि बिटफील्ड शेयर मेमोरी। फिर यदि मैं कुछ मल्टी-थ्रेडेड कोड करने जा रहा हूं, तो मुझे यह देखना चाहिए कि बिटसेट या बिटफील्ड के बीच चयन करने से पहले कोड कैसे काम करेगा। –
@MathieuVanNevel सबसे अच्छी सलाह जो मैं पेशकश कर सकता हूं वह है कि जब तक आप मेमोरी मैप किए गए I/O को लिख रहे हों, तब तक बिटफील्ड से पूरी तरह से बचें। –
अच्छी तरह से मैं बिटसेट के लिए बिटकफील्ड को हटाने की कोशिश करने जा रहा हूं। मैं समझता हूं क्यों alexeykuzmin0 ने हाँ कहा, लेकिन आप सही हैं कि इस प्रश्न का सही जवाब नहीं है। पता नहीं क्यों Stargateur इतनी कमजोर थी। –