भले ही ANSI C मानक इस बात के बारे में बहुत कम निर्दिष्ट करता है कि बिटफ़िल्ड को किसी भी महत्वपूर्ण लाभ की पेशकश करने के लिए कैसे पैक किया जाता है "कंपाइलर को बिटफ़िल्ड को पैक करने की अनुमति दी जाती है हालांकि वे फिट दिखते हैं", फिर भी कई मामलों में कंपाइलर को सबसे कुशल फैशन में चीजों को पैक करने से मना करते हैं।
विशेष रूप से, यदि किसी संरचना में बिटफ़िल्ड होते हैं, तो इसे एक संरचना के रूप में संग्रहीत करने के लिए एक कंपाइलर की आवश्यकता होती है जिसमें कुछ "सामान्य" संग्रहण प्रकार के एक या अधिक अनाम फ़ील्ड होते हैं और फिर प्रत्येक ऐसे फ़ील्ड को उसके घटक बिटफील्ड भागों में तार्किक रूप से उपविभाजित करते हैं। इस प्रकार, दिया गया:
unsigned char foo1: 3;
unsigned char foo2: 3;
unsigned char foo3: 3;
unsigned char foo4: 3;
unsigned char foo5: 3;
unsigned char foo6: 3;
unsigned char foo7: 3;
यदि unsigned char
8 बिट्स हैं, तो कंपाइलर को उस प्रकार के चार फ़ील्ड आवंटित करने की आवश्यकता होगी, और सभी को दो बिटफ़िल्ड असाइन करें, लेकिन एक (जो char
अपने स्वयं के क्षेत्र में होगा )। यदि सभी char
घोषणाओं के साथ प्रतिस्थापित किया गया था short
, तो दो प्रकार के क्षेत्र होंगे short
, जिनमें से एक में पांच बिटफ़िल्ड होंगे और जिनमें से अन्य शेष दो को पकड़ेंगे।
संरेखण प्रतिबंधों के बिना एक प्रोसेसर पर, डेटा unsigned short
को पहले पांच क्षेत्रों के unsigned char
लिए और अंतिम दो के लिए तीन बाइट्स में सात तीन-बिट फ़ील्ड्स का उपयोग करके अधिक कुशलता से रखा जा सकता है । जबकि तीन बाइट्स में आठ तीन-बिट फ़ील्ड को स्टोर करना संभव है, एक कंपाइलर केवल यह अनुमति दे सकता है कि यदि तीन-बाइट संख्यात्मक प्रकार का अस्तित्व है जो "बाहरी फ़ील्ड" प्रकार के रूप में उपयोग किया जा सकता है।
व्यक्तिगत रूप से, मैं बिटफिल्ड को मूल रूप से बेकार होने के रूप में परिभाषित करता हूं। यदि कोड को बाइनरी-पैक डेटा के साथ काम करने की आवश्यकता है, तो इसे स्पष्ट रूप से वास्तविक प्रकारों के भंडारण स्थानों को परिभाषित करना चाहिए, और फिर बिट्स तक पहुंचने के लिए मैक्रोज़ या कुछ अन्य ऐसे साधनों का उपयोग करना चाहिए। यदि C एक सिंटैक्स का समर्थन करता है तो यह उपयोगी होगा:
unsigned short f1;
unsigned char f2;
union foo1 = f1:0.3;
union foo2 = f1:3.3;
union foo3 = f1:6.3;
union foo4 = f1:9.3;
union foo5 = f1:12.3;
union foo6 = f2:0.3;
union foo7 = f2:3.3;
इस तरह के एक वाक्यविन्यास, अगर अनुमति दी जाती है, तो कोड के लिए पोर्टेबल फैशन में बिटफिल्ड का उपयोग करना संभव होगा, शब्द आकार या बाइट ऑर्डर के लिए बिना (f00 f1 के तीन सबसे कम महत्वपूर्ण बिट्स में होगा, लेकिन उन पर संग्रहीत किया जा सकता है कम या उच्च पता)। इस तरह की सुविधा के अभाव में, मैक्रोज़ शायद ऐसी चीजों के साथ काम करने का एकमात्र पोर्टेबल तरीका है।