2012-04-06 40 views
8

Đếm số tham chiếu chính xác là gì? Đặc biệt, nó là gì cho C++? Những vấn đề chúng ta có thể gặp phải là gì nếu chúng ta không xử lý chúng? Tất cả các ngôn ngữ có yêu cầu tính tham chiếu không?đếm chính xác trong C++ nghĩa là gì ?,

+2

Bắt đầu đọc [tại đây] (http://www.gotw.ca/gotw/043.htm). – Xeo

+1

"Tính tham chiếu là một tối ưu hóa phổ biến (còn được gọi là" bản sao lười biếng "và" sao chép khi viết ")." - Herb Sutter. WTF? Việc đếm tham chiếu chắc chắn * không * giống như "bản sao lười biếng" hoặc "sao chép khi viết". Tham khảo đếm (thường là) để quản lý bộ nhớ. Nó không phải là một tối ưu hóa cho mỗi se. –

+0

[Trang wikipedia về tính tham chiếu] (http://en.wikipedia.org/wiki/Reference_counting) là một phần giới thiệu khá tốt về chủ đề này. –

Trả lời

0

Thu thập bộ đếm số tham chiếu là một kỹ thuật mạnh mẽ để quản lý bộ nhớ giúp ngăn chặn các đối tượng bị xóa vô tình hoặc nhiều lần. Kỹ thuật này không giới hạn ở mã C++ và, mặc dù tên của nó, không liên quan đến khái niệm C++ của các biến tham chiếu. Thay vào đó, thuật ngữ này có nghĩa là chúng ta duy trì một số tất cả `` sở hữu tài liệu tham khảo '' đối tượng và xóa đối tượng khi số này trở thành số không.

1

Tính tham chiếu là cách tiếp cận đơn giản nhưng không hoàn chỉnh để phát hiện rác.

Khi bộ đếm đạt đến 0, bạn có thể giải phóng đối tượng đó.

NHƯNG nếu không có đối tượng sử dụng nhiều mà tham khảo mỗi chu kỳ khác, họ sẽ không bao giờ được phát hành

Xem xét một tài liệu tham khảo b, b tham khảo một, nhưng không có gì khác tham khảo a hoặc b. Số tham chiếu đếm trên a và b sẽ vẫn là 1 (= sử dụng)

+2

Nói đúng ra, bạn không phải "thu gom rác" khi bạn có tài nguyên được tính tham chiếu, vì không có rác. Rác là những gì bạn nhận được * sau khi * tất cả các tài liệu tham khảo đã bị mất. C++ thường không tạo ra rác. (Không giống như lập trình viên C++ *, có lẽ.) –

+0

Phải, đó là lý do tại sao tôi sử dụng thuật ngữ rác DETECTION –

+0

Nó không phải là "rác", mặc dù! –

-2

Tính tham khảo - cho phép sử dụng ẩn dụ.

Bạn có tai. Bạn muốn nó trở lại tại một số điểm.

Bạn có một nhóm người chỉ vào tai bạn. Bạn đếm chúng ngay sau khi chúng trỏ.

Khi số này chuyển sang không - nó chỉ là của bạn và bạn có thể thực hiện với nó như bạn muốn.

I.e. đưa nó ra khỏi phương trình (giải phóng nó trở lại bộ nhớ).

BTW. Thông tư công cụ là khó khăn để phát hiện.

+3

"Bạn có tai. Bạn muốn nó quay lại vào một thời điểm nào đó". Vâng, tôi đã có nó, không cần phải muốn nó trở lại. Nó cũng là tai của tôi khi một chục người chỉ vào nó. Ẩn dụ sai lầm. – Evert

7

Đếm số tham chiếu chính xác là gì? Đặc biệt, nó là gì cho C++?

Nói một cách đơn giản, tính toán Tham chiếu có nghĩa là đếm các tham chiếu đến một đối tượng.

Thông thường, C++ sử dụng kỹ thuật của RAII. Trong đó, khả năng quản lý việc deallocation của một đối tượng kiểu được gắn trong chính đối tượng kiểu đó. Điều này có nghĩa là người dùng không phải quản lý rõ ràng tuổi thọ của đối tượng và thỏa thuận của nó một cách rõ ràng, Chức năng để thực hiện việc quản lý này được xây dựng trong chính đối tượng đó.

Chức năng này có nghĩa là đối tượng nên tồn tại và vẫn hợp lệ cho đến khi có các bên liên quan tham chiếu đến đối tượng và điều này đạt được bằng cách tính tham chiếu. Mỗi lần đối tượng được chia sẻ (sao chép) số đếm tham chiếu (thường là một thành viên bên trong kiểu lớp) được tăng lên và mỗi lần hàm hủy được gọi là số đếm được giảm đi, khi đếm đến 0, đối tượng không bị ai đó hấp dẫn đánh dấu sự kết thúc của cuộc đời và do đó nó bị phá hủy.

Các sự cố mà chúng tôi có thể gặp phải là gì nếu chúng tôi không xử lý chúng?

Điều đó có nghĩa là không còn RAII nữa và quản lý tài nguyên thủ công vô tận và thường xuyên bị lỗi.
Trong những cơn ác mộng lập trình ngắn.

Mọi ngôn ngữ có yêu cầu tính tham chiếu không?

Ngôn ngữ không đòi hỏi tính tham khảo nhưng sử dụng kỹ thuật này cung cấp việc sử dụng rất dễ dàng và nỗ lực ít hơn cho người sử dụng ngôn ngữ, Vì vậy, hầu hết các ngôn ngữ thích sử dụng nó để cung cấp những lợi thế này để người dùng của họ.