2010-05-31 17 views
6

Tôi đã đọc bài luận Surviving the Release Version.Bí danh biến C + + - chính xác là gì và tại sao tốt hơn nên tắt nếu tắt?

Dưới sự "Aliasing lỗi" khoản nó nói:

Bạn có thể nhận được mã chặt chẽ hơn nếu bạn nói với trình biên dịch rằng nó có thể giả định không răng cưa ....

tôi cũng đã đọc Aliasing (computing).

Bí danh biến chính xác là gì? Tôi hiểu nó có nghĩa là sử dụng một con trỏ tới một biến là một bí danh, nhưng, tại sao nó ảnh hưởng xấu, hay nói cách khác - tại sao nói với trình biên dịch rằng nó có thể giả định không có răng cưa sẽ khiến tôi "mã chặt hơn"

Trả lời

5

Nếu bạn có con trỏ char* b, bạn có thể giả định rằng b là con trỏ duy nhất trong chương trình trỏ đến vị trí bộ nhớ cụ thể đó, nghĩa là thời gian duy nhất vị trí bộ nhớ thay đổi là khi lập trình viên sử dụng b thay đổi nó. Do đó, assembly được tạo ra không cần phải nạp lại bộ nhớ được chỉ định bởi b vào một thanh ghi miễn là trình biên dịch biết không có gì đã sử dụng b để sửa đổi nó. Nếu có thể cho phép đánh dấu răng cưa, có thể có một con trỏ khác là char* c = b; được sử dụng ở nơi khác để gây rối với bộ nhớ đó

+0

"Cụm được tạo ra do đó không cần phải tải lại bộ nhớ được chỉ bởi b ...". Đó là tất cả những gì tôi cần, cảm ơn bạn. Trên thực tế, sau khi đọc câu trả lời của bạn, chỉ sau đó tôi thực sự hiểu câu trả lời của Samuel, như bạn đã hoàn thành câu đố. Cảm ơn cả hai sau đó !! – Poni

12

Bí danh là khi bạn có hai tham chiếu khác nhau vào cùng bộ nhớ cơ bản. Hãy xem xét ví dụ này được tạo thành:

int doit(int *n1, int *n2) 
{ 
    int x = 0; 

    if (*n1 == 1) 
    { 
     *n2 = 0; 

     x += *n1 // line of interest 
    } 

    return x; 
} 

int main() 
{ 
    int x = 1; 

    doit(&x, &x); // aliasing happening 
} 

Nếu trình biên dịch phải cho phép đặt bí danh, cần xem xét khả năng n1 == n2. Do đó, khi cần sử dụng giá trị *n1 tại "sở thích", cần phải cho phép khả năng thay đổi theo dòng *n2 = 0.

Nếu trình biên dịch có thể giả định không có răng cưa, nó có thể giả định tại "dòng quan tâm" là *n1 == 1 (vì nếu không chúng tôi sẽ không nằm trong số if). Trình tối ưu hóa sau đó có thể sử dụng thông tin này để tối ưu hóa mã (trong trường hợp này, thay đổi "dòng quan tâm" từ sau con trỏ và thực hiện một mục đích chung để sử dụng một số gia tăng đơn giản).

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