我在看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())
^