2011-10-18 32 views
9

Tôi đã đọc question này, tôi muốn hỏi thêm về mã mà anh đã thể hiện nghĩaNhầm lẫn giữa gian và thời gian địa phương trong mã thực tế đời sống

for(i = 0; i < 20; i++) 
    for(j = 0; j < 10; j++) 
     a[i] = a[i]*j; 

Các câu hỏi là,

  1. Tôi hiểu địa phương thời gian, tôi nghĩ rằng các tham chiếu đến i và j nên là địa phương thời gian. Tôi có đúng không?
  2. Tôi cũng hiểu địa phương không gian, vì câu hỏi tôi đã liên kết câu trả lời có liên quan đến [i] nên là địa phương không gian. Tôi có đúng không?
  3. Người đó nói,

    "Các vòng lặp bên trong sẽ gọi địa chỉ bộ nhớ tương tự khi truy cập vào một [i] mười lần vì vậy đó là một ví dụ cho địa phương thời gian tôi đoán. Nhưng có địa phương không gian cũng trong vòng lặp trên? "

    Tôi không đồng ý với dự đoán của anh ấy. Do các tham chiếu được tạo bởi [i] nên là địa phương không gian (chúng sẽ tham chiếu phần tử tiếp theo trong khối). Tôi có đúng không?

Trả lời

18

Trước hết, tài liệu tham khảo để var có thể tạm địa phương hoặc không gian địa phương không thời gian địa phương, đó là không đúng ngữ pháp. Điểm nhỏ.

Bây giờ, về các câu hỏi của bạn.

  1. Nguyên tắc địa phương Temporal khẳng định rằng hai hướng dẫn tham khảo cùng một vị trí trong một khoảng thời gian tương đối ngắn. Ví dụ, trong mã được đưa ra, a[i] được tham chiếu thường xuyên, với các hướng dẫn như a[i] = a[i] * 2a[i] = a[i] * 3 được thực hiện rất gần nhau. Nếu chúng ta nhìn vào phạm vi này, chúng ta có thể nói rằng các tham chiếu đến ja[i] là tạm thời cục bộ. Các tham chiếu đến i cũng là tạm thời cục bộ, vì i được tham chiếu mỗi khi a[i] là. Tuy nhiên, nếu dòng cuối cùng của mã đã cho đọc giống như a[j] = a[j] * j, thì tham chiếu đến i sẽ không được tạm thời cục bộ, ít nhất là trong phạm vi của vòng lặp bên trong [1].

  2. Nguyên tắc Địa điểm không gian nêu rõ hai hướng dẫn tham chiếu đến vị trí bộ nhớ liền kề nhau. Tài liệu tham khảo cho a[i] là một ví dụ tốt về điều này, vì người ta có thể giả định (hầu hết thời gian) rằng a[0]a[1] sẽ nằm cạnh nhau trong bộ nhớ.

  3. Hai yếu tố đầu tiên về cơ bản bao gồm điều này, nhưng văn bản được trích dẫn là chính xác và mã cũng thể hiện vị trí không gian.

[1] - Nói chung, khi bạn nói về địa phương, nó sẽ ở trong bối cảnh của một cấp độ nhất định trong hệ thống phân cấp bộ nhớ, cho dù đó là RAM hay bộ đệm L1 hay những gì bạn có. Trong tất cả, nhưng ý nghĩa hạn chế nhất, các tham chiếu đến cả hai số ij đều ở trạng thái tạm thời.

+0

Cảm ơn câu trả lời. Bạn có thể làm rõ các khái niệm của tôi về các biến và địa phương. Biến j sẽ được tăng lên mỗi khi vòng lặp bên trong thực hiện và sẽ nhận được một giá trị mới. Lấy một giá trị mới KHÔNG PHẢI là không gian địa phương (mặc dù nếu nó tăng thêm 1 lần mỗi lần)? –

+0

@Akito chính xác, không gian địa phương chỉ có thể xảy ra giữa hai * vị trí * khác nhau trong bộ nhớ. Vì 'j' chỉ cùng một vị trí mỗi lần, tham chiếu đến' j' không phải là địa phương không gian. – brc

+0

Bạn có thể vui lòng xây dựng các tham chiếu thuật ngữ được sử dụng hay không. Điều đó nghĩa là gì? –

2

Vòng ngoài là ví dụ về địa phương không gian. Nó tuần tự tăng địa chỉ các cuộc gọi vòng lặp bên trong.

Vòng lặp bên trong thể hiện vị trí thời gian. Địa chỉ bộ nhớ chính xác được truy cập 10 lần liên tiếp, và nhân với j mỗi lần.

Đối với hai câu hỏi đầu tiên của bạn, cả i và j (bộ đếm vòng lặp) là ví dụ rất tốt về địa phương thời gian.

Địa phương là biện pháp được áp dụng bởi bộ nhớ cache để giảm thiểu các cuộc gọi vào bộ nhớ. Nếu một lệnh cần biết giá trị của một địa chỉ bộ nhớ chưa có trong cache, nó sẽ truy cập vào bộ nhớ và lưu trữ tất cả các vị trí bộ nhớ xung quanh trong bộ nhớ cache.

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