2013-03-01 12 views
35

W C++11's language feature list znajduje się:C++ 11 Garbage Collector - Dlaczego i Hows

minimalne wsparcie dla zbierania śmieci i wycieku osiągalności oparte wykrywania

(ale wydaje się, nie bądź realizowane w GCC i Clang.)

Dlaczego standardowa komisja wprowadziła tę funkcję zbierania śmieci C++?

Czy C++ naprawdę potrzebuje GC? Czy RAII nie jest tak doskonałym wzorcem (który może być użyty jednolicie zarówno dla zasobów pamięci, jak i pamięci, takich jak gniazda, pliki, tekstury ...)?

Czy GC złamie jednolitość wzorca kodu C++, który używa RAII?

Niektórzy twierdzą, że GC może się przydać, aby przerwać okrężne zależności, ale czy nie jest w porządku używanie do tego celu inteligentnych wskaźników, takich jak weak_ptr?

Co się stanie w przypadku odrzucenia wyjątków? W jaki sposób zmodyfikowany zostanie stos modyfikacji semantyki, aby wziąć pod uwagę GC?

Czy zostanie wprowadzony również wzór C# -like IDisposable?

Co więcej, zakładając, że GC zostanie wprowadzony w C++, czy składnia wskaźnika będzie inna? na przykład Czy będziemy mieli jakieś "wskaźniki" w kształcie kapelusza? ^, podobnie jak w rozszerzeniach C++/CLI lub C++/CX? Powinien istnieć sposób odróżnienia od zwykłych surowych wskaźników w porównaniu do "zarządzanych" wskaźników, prawda?

+8

C++ nie posiada GC i nigdy nie będzie mieć. –

+0

'weak_ptr' jest statyczne, nie może przerwać cykli dynamicznych. I jak to mówi, dodaje * minimalną obsługę * (w zasadzie definiuje rzeczy związane z osiągalnością). Cała reszta jest czystą spekulacją i nie należy do SO. –

+24

@AlexChamberlain GCs dla C++ już od dawna. –

Odpowiedz

50

Wniosek nie wprowadza garbage collector - pozwala na to w pewnych sytuacjach , jeśli implementacja wybierze. Standard po prostu określi te sytuacje jako powodujące niezdefiniowane zachowanie. W ten sposób rozluźnia wymagania implementacji, dając minimalną swobodę dla odśmiecacza.

Prosty przykład podany w the proposal bierze pod uwagę, kiedy bierzesz wskaźnik do dynamicznie przydzielonego obiektu, XOR to z inną wartością, ukrywając w ten sposób wartość wskaźnika, a następnie odzyskuje oryginalną wartość wskaźnika, aby uzyskać dostęp do obiektu za jego pośrednictwem. Przed C++ 11 byłoby to zupełnie w porządku i nadal byłoby możliwe do użycia. Jednak teraz taka operacja może być (patrz następny akapit) rozpatrywać niezdefiniowane zachowanie, co oznacza, że ​​implementacja może wykonać odśmiecenie obiektu, który został wskazany.

Standardowe stwierdza, że ​​realizacja może albo mieć zrelaksowany bezpieczeństwo wskaźnik, w przypadku których zachowanie jest jak to było wcześniej, czy ścisłego bezpieczeństwa wskaźnik, która pozwala na wprowadzenie śmieciarza.

implementacja może mieć zrelaksowany bezpieczeństwo wskaźnik, w którym to przypadku ważność wartości wskaźnika nie zależy od tego, czy jest to bezpieczne dochodową wartość wskaźnika. Alternatywnie, implementacja może mieć ścisły wskaźnik bezpieczeństwa, w którym to przypadku wartość wskaźnika, który nie jest wartością wskaźnika pochodzącą z bezpiecznej odległości, jest nieprawidłową wartością wskaźnika, chyba że wskazany obiekt kompletny ma dynamiczny czas przechowywania i został wcześniej uznany za osiągalny (20,6 .4). [...] Implementacja określa, czy implementacja ma złagodzone lub ścisłe bezpieczeństwo wskaźnika.

Wartość wskaźnika jest wartością wskaźnika uzyskaną w sposób bezpieczny, jeśli wskazuje na obiekt przydzielany dynamicznie i nie przydarzyło się mu żadne śmieszne przedsięwzięcie (zdefiniowane bardziej szczegółowo w §3.7.4.3).

Jeśli realizacja ma jeszcze ścisłego bezpieczeństwa wskaźnik nadal chcesz zrobić powiedział zabawny działalności do wskaźnika bez wprowadzania niezdefiniowanej zachowanie można zadeklarować wskaźnik p jako osiągalny tak:

declare_reachable(p); 

Funkcja ta jest zdefiniowane w nagłówku <memory> wraz z powiązanymi funkcjami, takimi jak undeclare_reachable,i undeclare_no_pointers. Możesz także określić ścisłość implementacji za pomocą get_pointer_safety.

+0

Więc na przykład nie ma specjalnej składni określonej dla zarządzanych obiektów? Nie^czy coś takiego? A standard nie mówi nic o zachowaniu GC, jeśli zostanie zgłoszony wyjątek? –

+0

@ Mr.C64 Dokładnie. Nie ma wzmianki o zbieraczu śmieci. –

+10

+1 dla "zabawnego biznesu". To powinno być w specyfikacji :) –

Powiązane problemy