extern struct และโครงสร้างหน่วยความจำตาม ABI
จัดวางโครงสร้างหน่วยความจำให้ตรงกับ C
extern struct และโครงสร้างหน่วยความจำตาม ABI เป็นบทเรียน Zig Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Zig Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Zig Academy มีบทเรียนทั้งหมด 4 บทเรียน
เชื่อมต่อกับ C
เมื่อ Zig เรียกใช้โค้ด C ทั้งสองฝ่ายต้องเห็นพ้องกันเรื่องเลย์เอาต์หน่วยความจำ ข้อตกลงร่วมนี้เรียกว่า ABI
Struct ปกติไม่มีการรับประกัน
struct ปกติเปิดให้ Zig เลือกลำดับฟิลด์และไบต์เติมได้อย่างอิสระ ดังนั้นรูปแบบหน่วยความจำอาจไม่ตรงกับที่ไลบรารี C คาดไว้
เข้าสู่ extern struct
กำหนดชนิดข้อมูลเป็น extern struct แล้ว Zig จะจัดวางฟิลด์ตาม C ABI ให้ตรงกับฟิลด์ของ struct ใน C ทุกประการ
const Point = extern struct {
x: i32,
y: i32,
};ฟิลด์ยังคงเรียงตามลำดับ
extern struct จะรักษาลำดับการประกาศของคุณไว้เช่นเดียวกับ C ดังนั้นฟิลด์แรกจะอยู่ก่อนเสมอในหน่วยความจำ
ไบต์เติมแบบ C
ต่างจาก packed struct ตรงที่ extern struct ยังคงเพิ่มไบต์เติมเพื่อการจัดแนวตามวิธีเดียวกับคอมไพเลอร์ C
Packed กับ Extern
ใช้ packed เมื่อ ต้องการรูปแบบระดับบิตที่ตรงกันทุกประการ และใช้ extern เมื่อต้องการให้รูปแบบไบต์ตรงกับ C ทั้งสองแบบแก้ปัญหาการจัดวางคนละประเภท
ส่ง Struct ให้ C
สามารถส่ง extern struct ให้กับฟังก์ชัน Cได้โดยตรง เพราะรูปแบบหน่วยความจำตรงกับส่วนหัวที่ใช้คอมไพล์ฟังก์ชันนั้น
extern fn use_point(p: Point) void;ตรวจสอบขนาด
ยืนยันว่า extern struct ตรงกับ C ด้วย @sizeOf ซึ่งรายงานจำนวนไบต์ทั้งหมด รวมไบต์เติมสำหรับการจัดแนวด้วย
const n = @sizeOf(Point); // 8ตรวจสอบออฟเซ็ตของฟิลด์
ใช้ @offsetOf เพื่อดูตำแหน่งเริ่มต้นที่แน่นอนของแต่ละฟิลด์ เหมาะสำหรับตรวจสอบว่า struct เรียงตรงกับ C
const off = @offsetOf(Point, "y"); // 4ใช้ได้เฉพาะชนิดที่เข้ากันได้กับ C
ฟิลด์ใน extern struct ต้องเป็นชนิดที่เข้ากันได้กับ C ดังนั้นรูปแบบเฉพาะของ Zig เช่น slice จึงไม่อนุญาตให้ใช้ภายใน
สะพานเชื่อมสู่ C
เมื่อใช้ extern struct ร่วมกับ C ABI แล้ว Zig และ C สามารถใช้ข้อมูลร่วมกันได้อย่างปลอดภัย โดยไม่ต้องคัดลอกหรือคาดเดารูปแบบหน่วยความจำ 🔗
ตรวจสอบอย่างรวดเร็ว
ทบทวนว่า extern struct ออกแบบมาให้ตรงกับสิ่งใด
สรุปทบทวน
คุณได้เรียนรู้ว่า extern struct ตรงกับ C ABI โดยมีฟิลด์เรียงตามลำดับและไบต์เติมแบบ C สามารถส่งให้ C ได้ และตรวจสอบด้วย @sizeOf กับ @offsetOf 🎉
เรียนรู้ Zig ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 30
- บทเรียน
- 120
คำถามที่พบบ่อย
บทเรียน “extern struct และโครงสร้างหน่วยความจำตาม ABI” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “extern struct และโครงสร้างหน่วยความจำตาม ABI” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Zig Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Zig Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “extern struct และโครงสร้างหน่วยความจำตาม ABI”
จัดวางโครงสร้างหน่วยความจำให้ตรงกับ C คุณปฏิบัติ Zig Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Zig Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Zig Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “extern struct และโครงสร้างหน่วยความจำตาม ABI” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Zig Academy นี้ได้ไหม
ได้ บทเรียน Zig Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- packed struct สำหรับโครงสร้างหน่วยความจำที่แม่นยำ
- จำนวนเต็มความกว้างตามต้องการ เช่น u3
- ฟิลด์บิตและแฟล็ก
- extern struct และโครงสร้างหน่วยความจำตาม ABI