ส่วนติดต่อสำหรับตัวจัดสรร
สัญญาเดียวสำหรับแหล่งหน่วยความจำทั้งหมด
ส่วนติดต่อสำหรับตัวจัดสรร เป็นบทเรียน Zig Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Zig Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Zig Academy มีบทเรียนทั้งหมด 4 บทเรียน
ชนิดข้อมูลที่ใช้ร่วมกันทั่วไปหนึ่งชนิด
ตัวจัดสรรหน่วยความจำทุกตัวใน Zig จะถูกส่งต่อในรูปแบบชนิดเดียวคือ std.mem.Allocator โค้ดของคุณจะสื่อสารผ่านอินเทอร์เฟซนี้เพียงตัวเดียว ไม่เคยผูกกับกลไกเบื้องหลังตัวใดโดยเฉพาะ
const Allocator = std.mem.Allocator;อินเทอร์เฟซ ไม่ใช่คลาส
std.mem.Allocator เป็น อินเทอร์เฟซ ขนาดเล็ก ซึ่งประกอบด้วยพอยน์เตอร์และตารางฟังก์ชัน อินเทอร์เฟซนี้อธิบายว่าตัวจัดสรรหน่วยความจำทำอะไรได้บ้าง ไม่ได้ระบุว่าคุณใช้ตัวใด
กลไกเบื้องหลังมากมาย รูปแบบเดียวกัน
ตัวจัดสรรแบบหน้า หน่วยความจำแบบอารีนา หรือตัวจัดสรรสำหรับการทดสอบ ล้วนเปิดเผย รูปแบบ เดียวกัน การสลับจากตัวหนึ่งไปใช้อีกตัวไม่จำเป็นต้องเปลี่ยนโค้ดที่เรียกใช้งาน
รับตัวจัดสรรหน่วยความจำจริง
คุณสร้างตัวจัดสรรหน่วยความจำที่เป็นรูปธรรมขึ้นมาก่อน จากนั้นใช้ตัวจัดการ .allocator() ของมันเพื่อส่งต่อในรูปชนิดทั่วไป std.mem.Allocator
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
const a = gpa.allocator();ส่งต่อให้ฟังก์ชันถัดไป
เมื่อคุณมีตัวจัดสรรหน่วยความจำแล้ว ให้ส่ง ค่า เดียวกันนี้เข้าไปในทุกฟังก์ชันที่ต้องใช้หน่วยความจำ ทั้งโปรแกรมจึงสามารถใช้แหล่งเดียวร่วมกันได้
try doWork(a);ตัวจัดสรรแบบหน้า
std.heap.page_allocator ขอหน่วยความจำจาก OS โดยตรง วิธีนี้เรียบง่ายแต่มีความละเอียดหยาบ จึงเหมาะกับบล็อกขนาดใหญ่หรือมีอายุการใช้งานยาวนาน ไม่เหมาะกับบล็อกขนาดเล็กมาก
const a = std.heap.page_allocator;GeneralPurposeAllocator
GeneralPurposeAllocator เป็นตัวเลือกทั่วไปสำหรับการสร้างโปรแกรมแบบดีบัก ตัวนี้ติดตามทุกบล็อกและรายงานหน่วยความจำรั่วกับการคืนหน่วยความจำซ้ำให้คุณ
เหตุผลที่อินเทอร์เฟซมีประโยชน์
การเขียนโค้ดโดยอ้างอิงอินเทอร์เฟซทำให้ฟังก์ชันของคุณทำงานกับตัวจัดสรรหน่วยความจำ ใดก็ได้ โค้ดเดียวกันจึงทำงานได้ทั้งในการทดสอบ บนฮาร์ดแวร์เปล่า หรือบนเซิร์ฟเวอร์
ฟังก์ชันเพียงร้องขอ
ฟังก์ชันไม่จำเป็นต้องรู้ว่าตนได้รับตัวจัดสรรหน่วยความจำตัวใด มันเพียง เรียกใช้เมธอดอย่าง alloc และ free บน std.mem.Allocator ที่ได้รับมา
const buf = try a.alloc(u8, 16);ไม่มีตัวจัดสรรหน่วยความจำส่วนกลาง
Zig ไม่มีฮีป ส่วนกลางเพียงแห่งเดียว คุณเป็นผู้ตัดสินใจว่าแต่ละส่วนของโปรแกรมจะใช้ตัวจัดสรรหน่วยความจำใด ทำให้มองเห็นแหล่งหน่วยความจำและควบคุมได้ในแต่ละส่วน
ทดสอบด้วยตัวอื่น
ในการทดสอบ ให้ส่ง std.testing.allocator แทน โค้ดยังคงเหมือนเดิม แต่ตอนนี้หน่วยความจำรั่วจะทำให้การทดสอบไม่ผ่าน แสดงให้เห็นว่าอินเทอร์เฟซมีประโยชน์จริง ✅
ตรวจสอบความเข้าใจอย่างรวดเร็ว
ลองคิดดูว่าตัวจัดสรรหน่วยความจำทั้งหมดใน Zig ใช้ชนิดใดร่วมกัน
สรุป
คุณได้เรียนรู้ว่า std.mem.Allocator เป็นอินเทอร์เฟซเดียวที่ครอบตัวจัดสรรหน่วยความจำหลายรูปแบบ ดังนั้นโค้ดที่ร้องขอหน่วยความจำจึงทำงานกับตัวจัดสรรใดก็ได้ที่คุณส่งให้ 🎯
คำถามที่พบบ่อย
บทเรียน “ส่วนติดต่อสำหรับตัวจัดสรร” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ส่วนติดต่อสำหรับตัวจัดสรร” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Zig Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Zig Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ส่วนติดต่อสำหรับตัวจัดสรร”
สัญญาเดียวสำหรับแหล่งหน่วยความจำทั้งหมด คุณปฏิบัติ Zig Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Zig Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Zig Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “ส่วนติดต่อสำหรับตัวจัดสรร” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Zig Academy นี้ได้ไหม
ได้ บทเรียน Zig Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุใด Zig จึงไม่มีการจัดสรรที่ซ่อนอยู่
- ส่วนติดต่อสำหรับตัวจัดสรร
- alloc, free, create, destroy
- รายการแบบไดนามิกด้วย ArrayList