0Pricing
Zig Academy · บทเรียน

ส่วนติดต่อสำหรับตัวจัดสรร

สัญญาเดียวสำหรับแหล่งหน่วยความจำทั้งหมด

ส่วนติดต่อสำหรับตัวจัดสรร เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. เหตุใด Zig จึงไม่มีการจัดสรรที่ซ่อนอยู่
  2. ส่วนติดต่อสำหรับตัวจัดสรร
  3. alloc, free, create, destroy
  4. รายการแบบไดนามิกด้วย ArrayList
← กลับไปที่ Zig Academy