2013-08-01 14 views
15

C++ 11 giới thiệu một số interface to garbage collectors. Từ những gì tôi thấy, nó cung cấp một cách tiêu chuẩn để giao tiếp với GC (ví dụ: declare_no_pointers) và để nhận thông tin về cách xử lý con trỏ được cải trang (ví dụ: get_pointer_safety).Có sử dụng thực tế nào của Garbage Collection của C++ 11 không?

Tuy nhiên, không có cách nào được chuẩn hóa trong C++ 11 chưa phân bổ một khối bộ nhớ thô mà bạn không phải giải phóng thủ công. Có những trường hợp sử dụng mà điều đó sẽ giúp ích cho bạn, ngay cả khi các destructor không được gọi. Một ví dụ là triển khai các cấu trúc dữ liệu đồng thời hiệu quả (như đã đề cập bởi Herb Sutter) mà không cần phải xử lý các giao thức dọn dẹp phức tạp.

Cho đến nay, rất tốt. Câu hỏi của tôi (từ quan điểm của một nhà phát triển bình thường, không phải là nhà phát triển thư viện GC):

Có một ví dụ thực tế nơi giao diện C++ 11 GC mới đã giúp bạn?

Ít nhất theo quan điểm của tôi, thế giới không thay đổi. Nếu bạn cần GC, bạn vẫn phải tìm một thư viện không chuẩn, ví dụ: Boehm GC và tìm hiểu cách tích hợp và sử dụng nó. Giao diện chuẩn hóa mới sẽ không giúp ích nhiều cho sự tôn trọng đó. Nó cũng sẽ không giải quyết các vấn đề về tính di động.

(Về lâu dài, giao diện thông thường được xác định bởi các tiêu chuẩn C++ 11 hy vọng đền đáp. Tuy nhiên, mục tiêu câu hỏi của tôi chỉ tương lai gần.)

+6

Điều này không được hỗ trợ bởi bất kỳ trình biên dịch AFAIK nào. – Rapptz

+1

@Rapptz: Clang và gcc không hỗ trợ nó, nhưng msvc thì có. –

+7

Tôi có thể sẽ bị quấy rầy bởi một thiểu số nhưng rất nhỏ, nhưng ai sẽ muốn GC trong C++? Chúng tôi đã có RAII, và điều này đánh bại GC bất cứ lúc nào, như xa như C + + ngữ nghĩa có liên quan. Nhưng, phải thừa nhận, nó có thể hữu ích trong các ngôn ngữ khác mà không có cùng kỳ vọng - ví dụ. Tôi là một người hâm mộ Lisp lớn và tôi không thể tưởng tượng nó mà không có GC. – syam

Trả lời

8

Không, không có hiện sử dụng thực tế giao diện C++ 11 GC vì không có trình biên dịch hỗ trợ đầy đủ API này trong thời gian chờ đợi. Ngoài ra, tiêu chuẩn C++ 11 tuyên bố API này là tùy chọn và không có chuyển động nào được thấy để thực hiện nó trong các trình biên dịch chính (nhưng như Jesse Good lưu ý MSVC đã hỗ trợ nó). thông tin

Ngoài ra bạn nên tìm bài này, nó đã liên quan: Why garbage collection when RAII is available?

+0

Thú vị, tôi đã bỏ lỡ điểm rằng nó chỉ là tùy chọn. –

+0

Cảm ơn bạn đã liên kết. Dưới đây là một câu trả lời có liên quan khác mà tôi thấy hữu ích: http://stackoverflow.com/questions/10578627/whats-the-timeline-of-a-gc-implementation-in-mainstream-c-compilers/10578761#10578761 –

2

std::shared_ptr cung cấp những gì được gọi là thu gom rác thải tham khảo-tính. Nó rất đơn giản để thực hiện nhưng có một số nhược điểm. Cụ thể là nó kém hiệu quả hơn các hình thức thu gom rác thay thế trong nhiều ứng dụng, và quan trọng hơn là nó không thể xử lý các tham chiếu tuần hoàn.

Java và C# được gọi là "ngôn ngữ được quản lý" trái ngược với C++ được gọi là "ngôn ngữ không được quản lý" chủ yếu là do chúng triển khai thu thập rác và đánh dấu. Bộ sưu tập rác Mark-and-sweep xử lý các tham chiếu tuần hoàn. Nó thực hiện điều này bằng cách tìm kiếm một cách hợp lý biểu đồ của các đối tượng có thể truy cập, sau đó xóa định kỳ các đối tượng không thể truy cập được. Có những thuật toán phức tạp hơn được tối ưu hóa này (một được gọi là "thế hệ"), nhưng cấu trúc cơ bản chỉ là đánh dấu và quét.

Sự cố khi triển khai đánh dấu và quét trong C++ là có rất nhiều thao tác khiến việc theo dõi biểu đồ đối tượng trở nên khó khăn. Khái niệm "con trỏ có nguồn gốc an toàn" tìm cách tách biệt và xác định các vấn đề này để chúng tôi có thể nói những tính năng nào bạn có thể sử dụng để duy trì tính toàn vẹn của chế độ xem GC của biểu đồ đối tượng. Sau đó nó sẽ có thể cho một trình biên dịch để xác định tĩnh và chẩn đoán các cấu trúc vi phạm (các diễn giải lại, số học con trỏ, vv).

Những người khiếu nại "tại sao bạn muốn thu gom rác khi bạn có RAII" bị nhầm lẫn. RAII là một mô hình bộ nhớ có thể sử dụng một khái niệm sở hữu. Mỗi đối tượng phải được sở hữu bởi chính xác một đối tượng khác và chủ sở hữu đó chịu trách nhiệm về tuổi thọ của nó. Đối với nhiều mô hình đối tượng, điều này đơn giản không phải là tự nhiên hoặc triệu tập, vì một đối tượng được tham chiếu bởi nhiều đối tượng khác và không có chủ sở hữu rõ ràng.Đối với nhiều ứng dụng, bạn muốn một đối tượng tồn tại kết thúc tự động sau khi nó trở nên không được quan tâm, và đây là cách Java và C# hoạt động "theo mặc định".

Đó là ấn tượng của tôi rằng mô hình bộ nhớ mới và khái niệm "đối tượng có nguồn gốc an toàn" sẽ dẫn đến bộ thu gom đánh dấu và quét tùy chọn thực sự có sẵn trong thư viện chuẩn. Một tính năng như vậy sẽ cực kỳ được chào đón - nhưng tôi không nghĩ nó vẫn ở đó. Các "đối tượng có nguồn gốc an toàn" là một nền tảng cho những thứ sắp tới.

+4

* " Java và C++ được gọi là "Ngôn ngữ được quản lý, trái ngược với C++ được gọi là" ngôn ngữ không được quản lý ". * Đó chỉ là thuật ngữ được tạo bởi Microsoft để phân biệt giữa ngôn ngữ .NET và ngôn ngữ bản địa: http://en.wikipedia.org/wiki/ Managed_code – Manu343726

+0

@ Manu343726: Có lẽ ban đầu, nhưng thuật ngữ đang được sử dụng phổ biến bây giờ.Tính điểm của tôi là bộ sưu tập rác tự động đánh dấu và quét là sự khác biệt chính giữa Java/C# và C++ –

+0

ok, tôi chỉ đang đọc nó. – Manu343726