Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 c++;11:它的gc接口是什么,如何实现?_C++11_Garbage Collection - Fatal编程技术网

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

C++11 c++;11:它的gc接口是什么,如何实现?,c++11,garbage-collection,C++11,Garbage Collection,我在看比亚恩·斯特劳斯塔普的演讲 在44:26中,他提到“C++11指定了一个GC接口” 请问什么是接口,如何实现? 任何更详细的在线介绍,或一些示例代码来演示它吗?Stroustrup在他的文章中扩展了这一讨论,问题是GC的使用是可选的,库供应商可以自由实施一个或不实施: 垃圾收集(未引用区域的自动回收) 在C++中内存为可选< /强>;也就是说,垃圾收集器不是 强制执行的一部分。但是,C++11提供了 定义如果使用GC和ABI(应用程序),GC可以做什么 二进制接口)以帮助控制其操作 指针和

我在看比亚恩·斯特劳斯塔普的演讲

在44:26中,他提到“C++11指定了一个GC接口”

请问什么是接口,如何实现?
任何更详细的在线介绍,或一些示例代码来演示它吗?

Stroustrup在他的文章中扩展了这一讨论,问题是GC的使用是可选的,库供应商可以自由实施一个或不实施:

垃圾收集(未引用区域的自动回收) 在C++中内存为<强>可选< /强>;也就是说,垃圾收集器不是 强制执行的一部分。但是,C++11提供了 定义如果使用GC和ABI(应用程序),GC可以做什么 二进制接口)以帮助控制其操作

指针和生命周期的规则用“安全”表示 “导出指针”(3.7.4.3);粗略地说:“指向已分配内容的指针 通过新的或其子对象。” 对普通人:[……]

支持此的C++标准(Stroustrup所指的“接口”)的功能是:

这些功能如所示:

它的目的是支持垃圾收集的实现和 基于可达性的泄漏检测器。这是通过给出未定义的 程序的行为,例如,通过异或或将指针隐藏 使用另一个值,然后稍后将其恢复为普通值 指针并取消对它的引用。这些项目目前可能会产生 保守垃圾收集器的结果不正确,因为 仅由此类“隐藏指针”引用的对象可能会过早地 收集。出于同样的原因,基于可达性的泄漏检测器可能 错误地报告此类程序泄漏内存

您的实现支持“严格的指针安全性”,在这种情况下可以实现GC,或者它具有“宽松的指针安全性”(默认情况下),在这种情况下不支持。您可以通过查看的结果(如果可用)来确定


我不知道任何实际的标准C++的GC实现,但至少<强>标准正在准备它发生的基础>

>P>除了我已经投票赞成的好答案之外,我想在这里提供更多的信息(这不适合评论)。 下面是一个符合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;
    }
}
这意味着实现有一个微不足道的实现,它什么都不做

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())
            ^

g++
8.2.0也会输出
relaxed
,因此
libstdc++
也不会实现GC。
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())
            ^