ขนาดขององค์ประกอบประเภท struct ที่ใช้โดย sizeof() นั้นไม่เท่ากับขนาดของสมาชิกแต่ละคนเสมอไป บางครั้งคอมไพเลอร์จะเพิ่มช่องว่างภายในเพื่อหลีกเลี่ยงปัญหาการจัดตำแหน่ง ดังนั้นขนาดอาจเปลี่ยนไป ช่องว่างภายในจะถูกเพิ่มเมื่อสมาชิกโครงสร้างตามด้วยสมาชิกที่มีขนาดใหญ่กว่าหรือที่ส่วนท้ายของโครงสร้าง คอมไพเลอร์ที่ต่างกันมีข้อจำกัดการจัดตำแหน่งประเภทต่างๆ ในมาตรฐาน C โครงสร้างการจัดตำแหน่งทั้งหมดขึ้นอยู่กับการใช้งาน
กรณีที่ 1
ในกรณีนี้ double z มีความยาว 8 ไบต์ ซึ่งมากกว่า x (4 ไบต์) ดังนั้นจึงมีการเพิ่มช่องว่างภายในขนาด 4 ไบต์อีกอัน นอกจากนี้ ข้อมูลประเภทสั้น y มีพื้นที่หน่วยความจำ 2 ไบต์ จึงเพิ่ม 6 ไบต์พิเศษเป็นช่องว่างภายใน
โค้ดตัวอย่าง
#include <stdio.h> struct myStruct { int x; //Integer takes 4 bytes, and padding 4 bytes double z; //Size of double is 8-byte, no padding short int y; //Size of short is 2-byte, padding 6-bytes }; main() { printf("Size of struct: %d", sizeof(struct myStruct)); }
ผลลัพธ์ 2
Size of struct: 24
กรณีที่ 2
ในกรณีนี้ ดับเบิลจะถูกแทรกในตอนแรก และใช้พื้นที่ 8 ไบต์ ตอนนี้เพิ่มจำนวนเต็ม x (4 ไบต์) แล้ว ดังนั้นจึงมีพื้นที่อีก 4 ไบต์ เมื่อเพิ่ม y แบบสั้น จะสามารถใส่ลงในพื้นที่พิเศษ 4 ไบต์นั้นและใช้พื้นที่ทั้งหมด 16 ไบต์ได้
โค้ดตัวอย่าง
#include <stdio.h> struct myStruct { double z; //Size of double is 8-byte, no padding int x; //Integer takes 4 bytes, and padding 4 bytes short int y; //Size of short is 2-byte, padding 6-bytes }; main() { printf("Size of struct: %d", sizeof(struct myStruct)); }
ผลลัพธ์ 2
Size of struct: 16
กรณีที่ 3
ในกรณีที่สาม จะใช้พื้นที่หน่วยความจำ 16 ไบต์ด้วย แต่การจัดเรียงต่างกัน เนื่องจากสมาชิกตัวแรกเป็นสองเท่า จากนั้นจึงวางในตอนแรก จากนั้นจึงเพิ่มข้อมูลประเภทสั้น ขณะนี้เมื่อพยายามแทรกจำนวนเต็ม จะสามารถวางลงในพื้นที่ 6 ไบต์ที่เหลือได้ ดังนั้นจึงมีช่องว่างภายในหนึ่งรายการหลังจากสั้น แต่ไม่จำเป็นต้องมีการเติมหลังจากข้อมูลจำนวนเต็ม
โค้ดตัวอย่าง
#include <stdio.h> struct myStruct { double z; //Size of double is 8-byte, no padding short int y; //Size of short is 2-byte, padding 6-bytes int x; //Integer takes 4 bytes, and padding 4 bytes }; main() { printf("Size of struct: %d", sizeof(struct myStruct)); }
ผลลัพธ์ 2
Size of struct: 16