ath*_*hos 7 garbage-collection c++11
我正在观看Bjarne Stroustrup的演讲" The Essential C++ ".
在44:26他提到"C++ 11指定GC接口".
请问界面是什么,以及如何实现它?在线更详细的好介绍,还是一些示例代码来演示它?
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实现,但至少标准正在为它的发生奠定基础.
除了由很好的答案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)
| 归档时间: |
|
| 查看次数: |
920 次 |
| 最近记录: |