📦 Stack vs Heap

Hai vùng bộ nhớ cơ bản — Tốc độ vs Linh hoạt

🟣 Stack

LIFO, nhanh, tự động giải phóng. Lưu biến local, function calls, return addresses.

🩷 Heap

Linh hoạt, chậm hơn, quản lý thủ công (hoặc GC). Lưu objects, dynamic data.

1. Stack Memory

Stack (LIFO — Last In First Out):

│                 │
│  [local vars c] │ ← top (hàm C đang chạy)
│  [local vars b] │    (hàm B gọi C)
│  [local vars a] │    (hàm A gọi B)
│  [main()]       │ ← bottom
└─────────────────┘

Khi hàm C return → pop frame C
Khi hàm B return → pop frame B
→ Tự động giải phóng, không cần GC!
// C: Stack allocation
void example() {
    int x = 10;        // Stack ← nhanh, tự giải phóng
    int arr[5];         // Stack ← kích thước cố định
    char name[20];      // Stack ← compile-time size

    // Khi function return → tất cả biến trên stack bị POP
    // → Tự động giải phóng, cực nhanh
}

// Stack overflow example:
void infinite() {
    int bigArray[1000000]; // ~ 4MB
    infinite(); // recursion → STACK OVERFLOW 💥
}

2. Heap Memory

Heap (dynamic, no order):

┌─────────────────────────────┐
│  [Object A]     [    free   ]│
│  [Object B]  [Object D]     │
│  [   free  ]  [Object E]    │
│  [Object C]     [  free  ]   │
└─────────────────────────────┘

→ Không có thứ tự, phân mảnh (fragmentation)
→ Cần malloc/free (C) hoặc GC (Java, Go, JS)
// C: Heap allocation (manual)
void example() {
    // malloc → cấp phát trên Heap
    int *arr = (int *)malloc(1000 * sizeof(int));

    // Phải free thủ công → quên = MEMORY LEAK 💀
    free(arr);
}

// JavaScript: Heap allocation (automatic GC)
function example() {
    const obj = { name: "Alice" };  // Heap (GC quản lý)
    const arr = [1, 2, 3, 4, 5];   // Heap
    const str = "Hello World";      // Heap (strings)

    // V8 Garbage Collector tự thu hồi khi không còn reference
}

3. Bảng So Sánh

Tiêu chí 🟣 Stack 🩷 Heap
Cấp phát Tự động (compile time) Thủ công / GC (runtime)
Tốc độ Rất nhanh (chỉ move pointer) Chậm hơn (tìm vùng trống)
Size Nhỏ (1-8 MB mặc định) Lớn (giới hạn bởi RAM)
Giải phóng Tự động (function return) Manual (free) hoặc GC
Lưu gì Primitives, pointers, frames Objects, arrays, strings
Thread-safe Có (mỗi thread 1 stack) Không (shared, cần sync)
Lỗi Stack Overflow Memory Leak, fragmentation

4. Trong JavaScript

V8 Engine:
Stack: Primitives (number, string, boolean), function call frames
Heap: Objects, arrays, closures, functions
• Variables trên stack chứa reference (pointer) đến object trên heap

let a = 10;         // Stack: a = 10 (primitive)
let b = a;           // Stack: b = 10 (copy giá trị)
b = 20;              // a vẫn = 10 ✅

let obj1 = { x: 1 }; // Stack: obj1 = 0x001 (pointer) → Heap: { x: 1 }
let obj2 = obj1;      // Stack: obj2 = 0x001 (copy pointer, CÙNG object)
obj2.x = 99;          // obj1.x cũng = 99 ⚠️ (cùng reference)