2016-12-06 6 views
9

प्रश्न वास्तव में सरल है (पूछने के लिए), std::bitset<32> स्मृति के लिए uint32_t जैसा ही है? या यह std::array<bool, 32> की तरह है?प्रश्न: कैसे बिटसेट अंदर हैं?

uint32_t index : 20; 
uint32_t magic : 12; 

तो यह इस कोड के रूप में ही है:

मैं आमतौर पर की तरह कुछ करते हैं?

std::bitset<20> index; 
std::bitset<12> magic; 

उत्तर

7
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;

क्योंकि वे असतत वस्तुओं और इसलिए इसकी गारंटी जब तक पहुँच डेटा दौड़ पैदा करने के लिए नहीं कर रहे हैं विभिन्न धागे

बिटफील्ड कोड में यह सुरक्षित नहीं होगा। सूचकांक का अद्यतन जादू के पढ़ने के साथ एक दौड़ होगी, और यह अपरिभाषित व्यवहार है।

+0

आप सही हैं मैं बहु थ्रेडेड निहितार्थ भूल जाते हैं। मुझे पता है कि बिटफील्ड शेयर मेमोरी। फिर यदि मैं कुछ मल्टी-थ्रेडेड कोड करने जा रहा हूं, तो मुझे यह देखना चाहिए कि बिटसेट या बिटफील्ड के बीच चयन करने से पहले कोड कैसे काम करेगा। –

+0

@MathieuVanNevel सबसे अच्छी सलाह जो मैं पेशकश कर सकता हूं वह है कि जब तक आप मेमोरी मैप किए गए I/O को लिख रहे हों, तब तक बिटफील्ड से पूरी तरह से बचें। –

+0

अच्छी तरह से मैं बिटसेट के लिए बिटकफील्ड को हटाने की कोशिश करने जा रहा हूं। मैं समझता हूं क्यों alexeykuzmin0 ने हाँ कहा, लेकिन आप सही हैं कि इस प्रश्न का सही जवाब नहीं है। पता नहीं क्यों Stargateur इतनी कमजोर थी। –

2

थोड़ा क्षेत्र एक struct की जरूरत

struct { 
    uint32_t index : 20; 
    uint32_t magic : 12; 
} 

तो यह एक ही है कि

std::bitset<20> index; 
std::bitset<12> magic; 

"Multiple adjacent bit fields are usually packed together (although this behavior is implementation-defined): " नहीं है।

आपके पास दो std :: बिटसेट हैं ताकि वे समान स्मृति साझा नहीं कर सकें, इसलिए यह वही बात नहीं है।

+0

यदि आप सहमत नहीं हैं कि आप क्यों नहीं कहते हैं। मैं आपके तर्क के लिए खुला हूँ। – Stargateur

+0

मैं एक के लिए समझ में नहीं आता कि आप क्या जवाब देने की कोशिश कर रहे हैं। सवाल पूछता है कि कैसे 'बिटसेट' लागू किया गया है और आप उन्हें बिट-फ़ील्ड से तुलना करना शुरू करते हैं। मैं ओपी को बिट-फ़ील्ड और 'बिट्ससेट' के बीच के अंतर के बारे में पूछने के लिए कहां देख सकता हूं। – NathanOliver

+0

@NathanOliver वह दो प्रश्न पूछता है मैं दूसरे जवाब देता हूं।मैं अकेला हूं जो सभी प्रश्न पढ़ता है? – Stargateur

संबंधित मुद्दे