2009-02-08 20 views
5

Giả sử chúng tôi đã các biến địa phương:Các biến trên ngăn xếp được truy cập như thế nào?

int a = 0; 
int b = 1; 
int c = 2; 
int d = 3; 

Theo như tôi biết, chúng sẽ được phân bổ trên các hệ thống ngăn xếp, như thế này:

| | 
| 3 | d 
| 2 | c 
| 1 | b 
|_0_| a 

Điều này có nghĩa rằng để có được giá trị của a, các giá trị của d, c và b trước tiên phải được bật ra khỏi ngăn xếp? Nếu vậy, các giá trị này sẽ đi đâu? Điều này có nghĩa là việc truy cập vào các biến khai báo gần đây hơn sẽ nhanh hơn không? Hay tôi thiếu một cái gì đó (mà tôi nghi ngờ là trường hợp), và toàn bộ điều hoạt động theo một cách khác?

EDIT: cảm ơn, các bạn!

Trả lời

16

Các biến cục bộ trên ngăn xếp thường được truy cập liên quan đến cái gọi là con trỏ khung , điểm này ở đầu khung ngăn xếp của bạn. Nó cũng sẽ có thể làm điều này liên quan đến con trỏ ngăn xếp, nhưng kể từ khi điều này di chuyển xung quanh trong quá trình đánh giá các biểu thức nó là khó khăn hơn để theo dõi.

Trong thực tế, các biến này cũng có thể được lưu trong sổ đăng ký bộ xử lý.

+0

+1 cho giải thích về con trỏ ngăn xếp so với con trỏ khung – Christoph

+0

+1 lần nữa để giải thích – cbrulak

+0

+1 không được ngắt chuỗi +1 –

5

Hoặc tôi thiếu cái gì

Bạn đang thiếu rằng ngăn xếp nằm trong bộ nhớ thường xuyên, cho phép truy cập ngẫu nhiên - chỉ cần thêm thích hợp bù đắp để con trỏ khung (dưới cùng của 'địa phương 'stack) và bạn sẽ nhận được một con trỏ tới ô nhớ đang giữ giá trị.

1

Điều này có nghĩa rằng để có được giá trị của một, các giá trị của d, c và b đầu tiên phải được popped ra khỏi chồng?

Mã được phát ra chỉ đơn giản là di chuyển số byte đúng khi nhập hàm. Nó di chuyển nó trở lại khoảng cách tương tự khi rời khỏi chức năng. Vì vậy, nó không bật tắt các biến riêng lẻ. Giả sử một int là 4 byte, ví dụ bạn đưa ra sẽ di chuyển con trỏ stack 16 byte. Nó thực sự di chuyển nó xa hơn điều này vì các thông tin khác trong khung ngăn xếp như địa chỉ trả về.

+0

cảm ơn! (và liên kết thực sự hữu ích) – neo2862

Các vấn đề liên quan