Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Quản lý bộ nhớ toàn cục trong C++: Stack hay Heap?

Stack và heap dùng để lưu biến cục bộ và cấp phát động trong quá trình thực thi. Tuy nhiên, biến toàn cục (global variables) và cấu trúc dữ liệu toàn cục không nằm trên stack hay heap.

Vị trí bộ nhớ của biến toàn cục

  • Được cấp phát trong khoảng bộ nhớ cố định (fixed memory block) – thường là segment .data (đã khởi tạo) hoặc .bss (chưa khởi tạo/khởi tạo 0) của chương trình.
  • Kích thước và địa chỉ xác định tại compile-time / link-time, không thay đổi khi chạy.
  • Tồn tại suốt vòng đời chương trình (từ khi load đến khi exit).

Ví dụ minh họa

int a[10]; // Biến toàn cục: nằm trong .data/.bss – cố định

int main() {
    float *ptr = (float*)malloc(sizeof(float) * 10); // Cấp phát trên HEAP
    // ...
    free(ptr);
    return 0;
}

Lưu ý: Code gốc có lỗi syntax sizeof(float)10.0 – đã sửa thành sizeof(float) * 10.

Tóm tắt phân vùng bộ nhớ

Vùng nhớChứaĐộ sốngQuản lý
Text/CodeMã máyCả chương trìnhHệ điều hành
.dataBiến toàn cục/static đã khởi tạo ≠ 0Cả chương trìnhBiên dịch viên
.bssBiến toàn cục/static chưa khởi tạo hoặc = 0Cả chương trìnhHĐH (zero-fill)
StackBiến cục bộ, tham số, địa chỉ trả vềTrong hàmTự động (LIFO)
HeapCấp phát động (new/malloc)Tự do (new/delete)Lập trình viên

Lưu ý quan trọng

  • Biến static cục bộ (trong hàm) cũng nằm trong .data/.bss, không phải stack.
  • Hằng số chuỗi literal ("hello") thường nằm trong .rodata (read-only).
  • Tránh lạm dụng biến toàn cục – gây khó kiểm thử, xung đột tên, vấn đề thread-safety.