c ++ 11:它的gc接口是什么,以及如何实现?

ath*_*hos 7 garbage-collection c++11

我正在观看Bjarne Stroustrup的演讲" The Essential C++ ".

在44:26他提到"C++ 11指定GC接口".

请问界面是什么,以及如何实现它?在线更详细的好介绍,还是一些示例代码来演示它?

qua*_*dev 8

Stroustrup在他的C++ FAQ中扩展了这个讨论,事情是GC的使用是可选的,库供应商可以自由地实现一个:

垃圾收集(自动回收未引用的内存区域)在C++中是可选的 ; 也就是说,垃圾收集器不是实现的必要部分.但是,C++ 11提供了GC可以执行的操作的定义,以及用于帮助控制其操作的ABI(应用程序二进制接口).

指针和生命周期的规则用"安全派生指针"表示(3.7.4.3); 粗略地说:"指向由新的或其子对象分配的东西的指针." 普通凡人:[...]

支持它的C++标准中的函数(Stroustrup所指的"接口")是:

这些功能在N2670提案中介绍:

其目的是支持垃圾收集实现和基于可达性的泄漏检测器.这是通过给"隐藏指针"的程序提供未定义的行为来完成的,例如,通过将其与另一个值进行xor-ing,然后将其转换回普通指针并取消引用它.这样的程序当前可能用保守的垃圾收集器产生不正确的结果,因为可能过早地收集仅由这种"隐藏指针"引用的对象.出于同样的原因,基于可达性的泄漏检测器可能错误地报告此类程序泄漏存储器.

您的实现支持"严格指针安全",在这种情况下可以实现GC,或者它具有"放松指针安全"(默认情况下),在这种情况下它不是.您可以通过查看结果(std::get_pointer_safety()如果可用)来确定.

我不知道任何实际的标准C++ GC实现,但至少标准正在为它的发生奠定基础.


How*_*ant 6

除了由很好的答案quantdev,我已经upvoted,我想在这里提供一些更多的信息(这将不适合在评论).

这是一个符合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;
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

relaxed
Run Code Online (Sandbox Code Playgroud)

意味着实现有一个简单的实现,什么都不做.

libc ++输出:

relaxed
Run Code Online (Sandbox Code Playgroud)

VS-2015产出:

relaxed
Run Code Online (Sandbox Code Playgroud)

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())
            ^
Run Code Online (Sandbox Code Playgroud)