2009-05-05 10 views
16

अगर मैं एक सी ++ struct है, इस तरह के रूप में एक 64 बिट डेटा शब्द को परिभाषित ..क्या सी ++ struct वाक्य रचना "एक: ख" क्या मतलब है

struct SMyDataWord 
{ 
    int Name : 40; 
    int Colour : 24; 
}; 

: 40 वाक्य रचना का क्या मतलब है ... इसका मतलब यह है कि पहले 40 बिट्स नाम के लिए आरक्षित हैं और रंग के लिए शेष 24 बिट्स हैं?

ऐसा लगता है कि ऐसा प्रतीत होता है, लेकिन मैं इससे पहले नहीं आया हूं।

उत्तर

16

सी Name से लिया गया बिटकफील्ड 40 बिट चौड़ा है, Colour 24 बिट चौड़ा है। इसलिए आपकी संरचना में कम से कम 64 बिट्स हैं। मेरे सिस्टम पर 64 बिट 8 बाइट होंगे।

+6

64 बिट्स 8 बाइट्स कौन सी प्रणाली नहीं होगी? –

+10

पैडेंटिक होने के लिए, बाइट में बिट्स की संख्या कार्यान्वयन निर्भर है (सी, सी ++ मानक में से कोई भी देखें)। यह 'सीमा' शीर्षलेख में CHAR_BIT मैक्रो द्वारा दिया जाता है। – dirkgently

+1

कुछ आईबीएम मेनफ्रेम में 9 बिट बाइट्स, आईआईआरसी है। –

7

हां, यह bitfields के लिए वाक्यविन्यास है। वे आमतौर पर हार्डवेयर रजिस्टरों पर नक्शा बनाने वाले structs को परिभाषित करने के लिए उपयोग किया जाता है। यदि आप उनका उपयोग करने का निर्णय लेते हैं तो कुछ चीजों को ध्यान में रखना है, एक यह है कि आप यह नहीं जान सकते कि कंपाइलर फ़ील्ड बनाने वाले वास्तविक बाइट्स में लेआउट, ऑर्डरिंग और पैडिंग कैसे करता है और कंपेलरों (और शायद एक ही कंपाइलर के साथ लेकिन विभिन्न अनुकूलन सेटिंग्स के साथ भी)।

+0

आपके द्वारा पेश किए गए एमएसडीएन लिंक में, एक पंक्ति है: * ध्यान दें कि nYear 8 बिट लंबा है और घोषित प्रकार, हस्ताक्षरित int की शब्द सीमा को ओवरफ़्लो करेगा।इसलिए, यह एक नए हस्ताक्षरित int की शुरुआत में शुरू हो गया है। * क्या यह उपरोक्त आकृति के अनुसार गलत स्पष्टीकरण है? – zhangxaochen

6

यह एक बिटफील्ड परिभाषा है।

नाम एक पूर्णांक है जो लगभग 40 बिट जानकारी स्टोर करने में सक्षम है। रंग 24 बिट स्टोर कर सकते हैं।

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

बिटफ़ील्ड तक पहुंचने वाला कोड यद्यपि धीमी गति से निष्पादित करेगा।

3

Use them judiciously:

याद रखें बिट क्षेत्रों के बारे में है कि लगभग सब कुछ कार्यान्वयन निर्भर है। उदाहरण के लिए, चाहे बिट्स बाएं से दाएं या दाएं से बाएं संग्रहीत हैं, वास्तविक हार्डवेयर आर्किटेक्चर पर निर्भर करता है। इसके अलावा, प्रत्येक संकलक एक अलग सदस्य संरेखण मॉडल का उपयोग करता है, जिसके कारण अनुकूलित BillingRec के आकार 9. के बजाय 12 बाइट्स आप एक बिट क्षेत्र की पता नहीं ले सकते और न ही आप बिट्स की एक सरणी बना सकते हैं। अंत में, अधिकांश कार्यान्वयन पर बिट फ़ील्ड का उपयोग गति ओवरहेड होता है। इसलिए, जब आप अपने कोड को अनुकूलित करते हैं, तो का उपयोग करने का निर्णय लेने से पहले एक निश्चित अनुकूलन के प्रभाव को मापें और इसके ट्रेडऑफ़ को मापें।