แม้ว่ามาตรฐาน 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
สำหรับสองฟิลด์สุดท้ายจัดเก็บฟิลด์สามบิตเจ็ดฟิลด์ในสามไบต์ แม้ว่าจะเป็นไปได้ที่จะจัดเก็บฟิลด์สามบิตแปดช่องในสามไบต์ แต่คอมไพเลอร์สามารถอนุญาตได้ก็ต่อเมื่อมีประเภทตัวเลขสามไบต์ซึ่งสามารถใช้เป็นประเภท "ฟิลด์ด้านนอก" ได้
โดยส่วนตัวแล้วฉันคิดว่า bitfields ตามที่กำหนดไว้นั้นไร้ประโยชน์โดยทั่วไป หากโค้ดจำเป็นต้องทำงานกับข้อมูลที่บรรจุไบนารีควรกำหนดตำแหน่งพื้นที่จัดเก็บข้อมูลประเภทจริงอย่างชัดเจนจากนั้นใช้มาโครหรือวิธีการอื่น ๆ เพื่อเข้าถึงบิตดังกล่าว จะเป็นประโยชน์ถ้า 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;
ถ้าอนุญาตให้ใช้ไวยากรณ์ดังกล่าวจะทำให้โค้ดใช้ bitfields แบบพกพาได้โดยไม่คำนึงถึงขนาดของคำหรือลำดับไบต์ (foo0 จะอยู่ในบิตที่มีนัยสำคัญน้อยที่สุดสามบิตของ f1 แต่สามารถเก็บไว้ที่ ที่อยู่ต่ำกว่าหรือสูงกว่า) อย่างไรก็ตามไม่มีคุณสมบัติดังกล่าวมาโครอาจเป็นวิธีเดียวที่พกพาได้ในการใช้งานสิ่งเหล่านี้