Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

เหตุใด sizeof สำหรับโครงสร้างไม่เท่ากับผลรวมของ sizeof ของสมาชิกแต่ละคนใน C/C++


ขนาดขององค์ประกอบประเภท struct ที่ใช้โดย sizeof() นั้นไม่เท่ากับขนาดของสมาชิกแต่ละคนเสมอไป บางครั้งคอมไพเลอร์จะเพิ่มช่องว่างภายในเพื่อหลีกเลี่ยงปัญหาการจัดตำแหน่ง ดังนั้นขนาดอาจเปลี่ยนไป ช่องว่างภายในจะถูกเพิ่มเมื่อสมาชิกโครงสร้างตามด้วยสมาชิกที่มีขนาดใหญ่กว่าหรือที่ส่วนท้ายของโครงสร้าง คอมไพเลอร์ที่ต่างกันมีข้อจำกัดการจัดตำแหน่งประเภทต่างๆ ในมาตรฐาน C โครงสร้างการจัดตำแหน่งทั้งหมดขึ้นอยู่กับการใช้งาน

กรณีที่ 1

ในกรณีนี้ double z มีความยาว 8 ไบต์ ซึ่งมากกว่า x (4 ไบต์) ดังนั้นจึงมีการเพิ่มช่องว่างภายในขนาด 4 ไบต์อีกอัน นอกจากนี้ ข้อมูลประเภทสั้น y มีพื้นที่หน่วยความจำ 2 ไบต์ จึงเพิ่ม 6 ไบต์พิเศษเป็นช่องว่างภายใน

เหตุใด sizeof สำหรับโครงสร้างไม่เท่ากับผลรวมของ sizeof ของสมาชิกแต่ละคนใน C/C++

โค้ดตัวอย่าง

#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 ไบต์ได้

เหตุใด sizeof สำหรับโครงสร้างไม่เท่ากับผลรวมของ sizeof ของสมาชิกแต่ละคนใน C/C++

โค้ดตัวอย่าง

#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 ไบต์ที่เหลือได้ ดังนั้นจึงมีช่องว่างภายในหนึ่งรายการหลังจากสั้น แต่ไม่จำเป็นต้องมีการเติมหลังจากข้อมูลจำนวนเต็ม

เหตุใด sizeof สำหรับโครงสร้างไม่เท่ากับผลรวมของ sizeof ของสมาชิกแต่ละคนใน C/C++

โค้ดตัวอย่าง

#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