การจัดสรรบนสแตก
ทำความเข้าใจการทำงานของหน่วยเก็บข้อมูลอัตโนมัติ
การจัดสรรบนสแตก เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การจัดสรรบนสแตก
- การจัดสรรบนฮีพด้วย new/delete
- อายุการใช้งานของออบเจกต์
- ข้อบกพร่องของหน่วยความจำที่พบบ่อย