Bản chất của việc cấp phát vùng nhớ cho biến tại thời điểm Compile time?

Theo em biết thì những biến như: biến cục bộ, toàn cục, biến tĩnh, hằng số … được cấp phát lúc compile, còn những biến được cấp phát động (bằng new, malloc…) thì sẽ được cấp phát vào thời điểm runtime.
Theo em biết thì thời điểm compile time ý nói đến lúc compile chương trình từ 1 đoạn code thành file exe. Nhưng thực tế trong quá trình dịch ra file .exe , trình biên dịch lưu lại thông tin về các biến để lúc thực thi thì nó sẽ biết để chiếm bao nhiêu ô nhớ trong RAM ngay lập tức? điều này đúng không ạ?

Ví dụ ta khai báo:

int arr[5];
int b;

thì có phải trình biên dịch sẽ lưu lại thông tin về các biến này (nghĩa là lưu vào đầu file exe) để khi chương trình được thực thi thì nó sẽ chiếm 5*4+4=24 byte trên RAM ngay lập tức đúng ko ạ?

1 Like

Trừ biến cục bộ sẽ biến thành địa chỉ bộ nhớ (offset so với ESP), còn biến toàn cục và biến tĩnh thì lưu như vậy.

3 Likes

Anh có thể giải thích rõ hơn không ạ? :sweat:
Cái biến cục bộ biến thành địa chỉ bộ nhớ nghĩa là sao ạ?

Hi Quốc Việt.


Hãy xem qua một chút về phân bổ bộ nhớ khi chạy chương trình.
Khi bạn chạy chương trình thì hdh sẽ tải các chỉ thị của chương trình đó vào bộ nhớ text. Khi gặp các khai báo biến toàn cụ thì nó tạọ các vung nhớ tại phân vùng data. Sau đó là tải hàm main vào tạo các biến cục bộ trong hàm main vào stack. Khi thấy có cấp phát động thì nó tạo các biến trong vùng nhớ heap.

3 Likes

vậy là biến cục bộ không được cấp phát tại compile time ?

Đúng vậy :smiley: khi vào hàm thì mới trừ stack rồi lấy offset.

5 Likes

thanks anh em cũng nghĩ chỉ có như vậy mới đẻ ra cái lỗi stackoverflow tại runtime đc :smiley:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?