2012-05-09 31 views
10

Tại sao một số người làm:Tôi có thể nhận được các biến tĩnh hoạt động tốt nhất không?

char baa(int x) { 
    static char foo[] = " .. "; 
    return foo[x ..]; 
} 

thay vì:

char baa(int x) { 
    char foo[] = " .. "; 
    return foo[x ..]; 
} 

trông giống như rất phổ biến trên các ứng dụng mã nguồn Linux. Có sự khác biệt về hiệu suất? nếu có, ai đó có thể giải thích lý do tại sao? Cảm ơn trước.

+1

Mã này không biên dịch, trình chỉ định mảng phải SAU tên biến, không phải trước tên biến. –

Trả lời

9

Nó không phải cho hiệu suất mỗi se, mà là để giảm mức sử dụng bộ nhớ. Có tăng hiệu suất, nhưng không phải (thường) lý do chính bạn thấy mã như vậy.

Biến trong một hàm được phân bổ trên ngăn xếp, chúng sẽ được đặt trước và xóa mỗi khi hàm được gọi và quan trọng là chúng sẽ được tính vào giới hạn kích thước ngăn xếp. nền tảng hạn chế.

Tuy nhiên, các biến tĩnh được lưu trữ trong một trong hai .BSS hay .DATA phân khúc (biến tĩnh không rõ ràng khởi tạo sẽ đi đến .BSS, các biến tĩnh tĩnh-khởi tạo sẽ đi đến .DATA), ra khỏi stack. Trình biên dịch cũng có thể tận dụng điều này để thực hiện tối ưu hóa nhất định.

3

Có, hiệu suất khác: không giống như biến trong bộ nhớ tự động được khởi tạo mỗi lần, biến tĩnh được khởi tạo chỉ một lần, lần đầu tiên bạn thực hiện chức năng. Nếu fookhông phải được ghi, không có sự khác biệt nào khác. Nếu nó được ghi vào, các thay đổi đối với các biến tĩnh tồn tại giữa các cuộc gọi, trong khi các thay đổi đối với các biến tự động sẽ bị mất trong lần tiếp theo thông qua hàm.

2

Xác định biến tĩnh trong phương thức chỉ có nghĩa là biến không được "giải phóng", tức là biến sẽ giữ giá trị của nó trên các cuộc gọi tiếp theo. Nó có thể dẫn đến cải thiện hiệu suất tùy thuộc vào thuật toán, nhưng chắc chắn không phải không phải là cải thiện hiệu suất của chính nó.

3

Trong triển khai điển hình, phiên bản có static sẽ chỉ đặt chuỗi ở đâu đó trong bộ nhớ lúc biên dịch, trong khi phiên bản không có static sẽ làm cho hàm (mỗi lần được gọi) phân bổ một số khoảng trống trên ngăn xếp và ghi chuỗi không gian đó.

Phiên bản với static, do đó,

  • có khả năng là nhanh hơn
  • thể sử dụng ít bộ nhớ
  • sẽ sử dụng không gian ít hơn chồng (mà trên một số hệ thống là một nguồn tài nguyên khan hiếm)
  • sẽ chơi đẹp hơn với bộ nhớ cache (mà không có khả năng là một việc lớn đối với một chuỗi nhỏ, nhưng có thể là nếu foo là thứ gì đó lớn hơn).
+1

Bạn có nghĩa là cũ, không phải sau này. –

+0

Tại sao có, vì vậy tôi đã làm. Cảm ơn. Tôi đã chỉnh sửa câu trả lời của mình thành (1) rõ ràng hơn và (2) chính xác. –

+0

lý do tại sao nó sẽ tiết kiệm bộ nhớ? khi tải các chức năng hiện nó vẫn cần phải chi phí bộ nhớ stack? – dragonxlwang

1

Có nó làm cho sự khác biệt, nếu u đã tuyên bố một biến như tĩnh:

  1. Thứ nhất, bộ nhớ sẽ được phân bổ trong cả hai bss hoặc phân đoạn dữ liệu thay vì ngăn xếp.

  2. Thứ hai, nó sẽ được khởi tạo một lần duy nhất, không phải mỗi lần không giống các biến số khác của hàm , điều này chắc chắn sẽ tạo ra sự khác biệt.

  3. Thứ ba, nó giữ lại giá trị b/w các cuộc gọi hàm. Do đó tùy thuộc vào các trường hợp bạn nên sử dụng .

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