0Pricing
C++ Academy · บทเรียน

การจัดสรรบนสแตก

ทำความเข้าใจการทำงานของหน่วยเก็บข้อมูลอัตโนมัติ

การจัดสรรบนสแตก เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

หน่วยเก็บข้อมูลอัตโนมัติ

ตัวแปรภายในอยู่ในหน่วยเก็บข้อมูลอัตโนมัติ ซึ่งมักเรียกว่า สแตก ตัวแปรเหล่านี้ถูกสร้างขึ้นเมื่อการทำงานเข้าสู่ขอบเขต และถูกทำลายเมื่อออกจากขอบเขต

#include <iostream>

int main() {
    int x = 42;          // on the stack
    double pi = 3.14;    // on the stack
    std::cout << x << " " << pi << "\n";
}

สแตกขยายและหดตัว

การเรียกใช้ฟังก์ชันแต่ละครั้งจะดันเฟรมสแตกที่เก็บตัวแปรภายในของฟังก์ชันนั้น เมื่อฟังก์ชันส่งคืนค่า เฟรมจะถูกนำออกและตัวแปรภายในจะหายไป โดยไม่ต้องล้างข้อมูลด้วยตนเอง

#include <iostream>

void greet() {
    int local = 7;          // pushed on call
    std::cout << local << "\n";
}                            // popped on return

int main() { greet(); }

ลำดับเข้าหลังออกก่อน (LIFO)

สแตกมีลำดับแบบเข้าหลังออกก่อน ตัวแปรภายในที่สร้างขึ้นล่าสุดจะถูกทำลายเป็นตัวแรกเมื่อขอบเขตสิ้นสุด

#include <iostream>

int main() {
    int a = 1;
    {
        int b = 2;   // created after a
        std::cout << b << "\n";
    }                // b destroyed first
    std::cout << a << "\n";
}

รวดเร็วและประหยัด

การจัดสรรบนสแตกรวดเร็วมาก เพราะเพียงขยับตัวชี้สแตกเท่านั้น ไม่ต้องค้นหาหน่วยความจำว่างและไม่ต้องจัดการบันทึกข้อมูลเหมือนที่ฮีปต้องทำ

ขอบเขตกำหนดอายุการใช้งาน

วัตถุบนสแตกจะมีอยู่เฉพาะภายในบล็อกที่ประกาศวัตถุนั้น บล็อกซ้อนกันจะมีขอบเขตของตนเอง

#include <iostream>

int main() {
    for (int i = 0; i < 3; ++i) {
        int square = i * i;   // recreated each iteration
        std::cout << square << "\n";
    }
}

ขนาดจำกัด

สแตกมีขนาดคงที่และจำกัด ซึ่งมักมีเพียงไม่กี่เมกะไบต์ การจัดสรรอาร์เรย์ขนาดใหญ่มากบนสแตกอาจทำให้โปรแกรมหยุดทำงานเนื่องจากสแตกโอเวอร์โฟลว์

// Risky: a large fixed array on the stack
int big[1000000];   // may overflow the stack

การคืนที่อยู่ของสแตกเป็นข้อผิดพลาด

อย่าคืนค่าตัวชี้หรือการอ้างอิงไปยังตัวแปรภายในโดยเด็ดขาด เมื่อฟังก์ชันส่งคืนค่า หน่วยเก็บข้อมูลนั้นจะหายไปและตัวชี้จะกลายเป็นตัวชี้ลอย

int* bad() {
    int local = 5;
    return &local;   // BUG: local dies here
}

ส่งออบเจ็กต์ขนาดใหญ่ด้วยการอ้างอิง

การคัดลอกออบเจ็กต์ขนาดใหญ่ไปไว้บนสแตกเป็นการใช้ทรัพยากรอย่างสิ้นเปลือง โปรดส่งออบเจ็กต์เหล่านี้ด้วย const& เพื่อหลีกเลี่ยงการคัดลอกและยังคงใช้พื้นที่สแตกน้อย

#include <string>

void print(const std::string& s) {  // no copy
    // use s
}

ออบเจ็กต์บนสแตกไม่ต้องคืนหน่วยความจำ

เนื่องจากคอมไพเลอร์จัดการอายุการใช้งานของออบเจ็กต์เหล่านี้โดยอัตโนมัติ คุณจึงต้อง ไม่เรียกใช้ delete กับตัวแปรบนสแตกโดยเด็ดขาด

#include <iostream>

int main() {
    int n = 10;
    // delete &n;   // ERROR: not heap-allocated
    std::cout << n << "\n";
}

อาร์เรย์บนสแตก

อาร์เรย์ขนาดคงที่ที่ทราบความยาวแน่นอนจะอยู่บนสแตกและถูกคืนหน่วยความจำโดยอัตโนมัติเมื่อขอบเขตสิ้นสุดลง

#include <iostream>

int main() {
    int values[3] = {10, 20, 30};
    for (int v : values) std::cout << v << "\n";
}

เมื่อใดควรเลือกใช้สแตก

โปรดเลือกใช้สแตกสำหรับออบเจ็กต์ขนาดเล็กที่มีอายุสั้นและทราบขนาดตั้งแต่เวลาคอมไพล์ สแตกทำงานได้เร็วกว่าและจัดการล้างหน่วยความจำให้เอง โปรดเลือกใช้ฮีปเฉพาะเมื่อจำเป็นจริง ๆ

ตรวจสอบความเข้าใจอย่างรวดเร็ว

โปรดทดสอบความเข้าใจเรื่องการจัดสรรหน่วยความจำบนสแตก

สรุปทบทวน

คุณได้เรียนรู้ว่า การจัดสรรบนสแตก ใช้พื้นที่จัดเก็บแบบอัตโนมัติที่ผูกกับขอบเขต โดยตัวแปรจะถูกสร้างเมื่อเข้าสู่ขอบเขตและถูกทำลายเมื่อออกจากขอบเขตตามลำดับ LIFO วิธีนี้รวดเร็ว ล้างหน่วยความจำให้เอง และมีขนาดจำกัด โปรดอย่าคืนที่อยู่ของตัวแปรภายใน และอย่าใช้ delete กับออบเจ็กต์บนสแตก

คำถามที่พบบ่อย

บทเรียน “การจัดสรรบนสแตก” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การจัดสรรบนสแตก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การจัดสรรบนสแตก”

ทำความเข้าใจการทำงานของหน่วยเก็บข้อมูลอัตโนมัติ คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “การจัดสรรบนสแตก” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. การจัดสรรบนสแตก
  2. การจัดสรรบนฮีพด้วย new/delete
  3. อายุการใช้งานของออบเจกต์
  4. ข้อบกพร่องของหน่วยความจำที่พบบ่อย
← กลับไปที่ C++ Academy