我在看Bjarne Stroustrup的演講「The Essential C++」。C++ 11:它的gc接口是什麼,以及如何實現?
在44:26他提到「C++ 11指定了GC接口」。
請問接口是什麼,以及如何實現它? 更詳細的在線好介紹,或一些示例代碼來證明它?
我在看Bjarne Stroustrup的演講「The Essential C++」。C++ 11:它的gc接口是什麼,以及如何實現?
在44:26他提到「C++ 11指定了GC接口」。
請問接口是什麼,以及如何實現它? 更詳細的在線好介紹,或一些示例代碼來證明它?
斯特勞斯在他C++ FAQ擴展了這個討論,事情是,GC的使用是可選的,庫供應商可以自由地實現一個或不:
垃圾收集(的 內存未引用地區的自動回收)是可選 in C++;也就是說,垃圾收集器不是實現的必需部分。然而,C++ 11提供了什麼,如果一個使用和ABI(應用 二進制接口),以幫助控制其動作的GC可以做 定義。
爲指針和壽命的規則在「安全 衍生指針」(3.7.4.3)來表示;大致爲:「指向由新的或其子對象分配的 的指針。」 到普通人:[...]
在C的功能++標準支持這個( 「接口」,其Stroustrup的所指的)是:
個這些功能都在the N2670 proposal:
其目的是爲了同時支持垃圾收集的實現和 基於可達性泄漏檢測器。這是通過給未定義 行爲程序,「隱藏指針」進行的,例如,異或它 與另一個值,再後來把它放回普通 指針並取消對它的引用。這樣的程序可以目前生產 用保守的垃圾收集器不正確的結果,因爲只有通過這種「隱藏指針」中引用的 對象可以是過早 收集。出於同樣的原因,基於可達性的泄漏檢測器可能會錯誤地報告此類程序泄漏內存。
無論您實現支持「嚴格的安全指針」在這種情況下實施GC是可能的,或者它有一個「寬鬆的指針安全」(默認),在這種情況下,事實並非如此。如果可用,您可以通過查看std::get_pointer_safety()
的結果來確定。
我不知道任何實際的標準C++ GC實現,但至少該標準正在爲其發生準備。
除了我提出的quantdev的好回答之外,我想在這裏提供更多的信息(這不適用於評論)。
這裏是一個C++ 11符合程序,其演示了一個實現是否支持GC接口:
#include <iostream>
#include <memory>
int
main()
{
#ifdef __STDCPP_STRICT_POINTER_SAFETY__
std::cout << __STDCPP_STRICT_POINTER_SAFETY__ << '\n';
#endif
switch (std::get_pointer_safety())
{
case std::pointer_safety::relaxed:
std::cout << "relaxed\n";
break;
case std::pointer_safety::preferred:
std::cout << "preferred\n";
break;
case std::pointer_safety::strict:
std::cout << "strict\n";
break;
}
}
的輸出:
relaxed
意味着實現具有微不足道實施什麼都不做。
的libC++輸出:
relaxed
VS-2015輸出:
relaxed
GCC 5.0輸出:
prog.cc: In function 'int main()':
prog.cc:10:13: error: 'get_pointer_safety' is not a member of 'std'
switch (std::get_pointer_safety())
^