Zig Academy · บทเรียน

extern struct และโครงสร้างหน่วยความจำตาม ABI

จัดวางโครงสร้างหน่วยความจำให้ตรงกับ C

บทเรียน 4 จาก 413 ขั้นตอน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. packed struct สำหรับโครงสร้างหน่วยความจำที่แม่นยำ
  2. จำนวนเต็มความกว้างตามต้องการ เช่น u3
  3. ฟิลด์บิตและแฟล็ก
  4. extern struct และโครงสร้างหน่วยความจำตาม ABI
← กลับไปที่ Zig Academy