C++11与最小垃圾回收

C++11新标准为了做到最小的垃圾回收支持,首先对“安全”的指针进行了定义,安全派生的指针是指向由new分配的对象或其子对象的指针

安全派生指针的操作包括:

1:在解引用基础上的引用,比如:&*p。

2:定义明确的指针操作,比如p + 1。

3:定义明确的指针转换,比如:static_cast<void*>(p)。

4:指针和整型之间的reinterpret_cast,比如:reinterpret_cast<intptr_t>(p)。这里的intptr_t指长度等于平台上指针的长度,由decltype声明。

在C++11中可以使用get_pointer_safety()函数来查询编译器是否支持这个特性。如果返回值是strcit则表示支持最小垃圾回收。

pointer_safety type = get_pointer_safety();

如果程序员代码中出现了指针不安全使用的状况,C++11允许程序员通过一些API来通知垃圾回收器不得回收该内存。可以使用垃圾回收的术语,声明该内存为“可到达”的。

#include <memory>

using namespace std;

int main()
{
	int *p = new int(10);
	declare_reachable(p);		//在p被隐藏之前声明为可到达的
	int*q = (int*)((long long)p ^ 2012);
	//...一些操作
	q = undeclare_reachable<int>((int*)((long long)q ^ 2012));
	*q = 10;
}

有的时候程序员会选择在一大片连续的堆内存上进行指针式操作,为了让垃圾回收器不关心该区域,可以使用下面的两个函数:

void declare_no_pointers(char *p, size_t n) noexcept;
void undeclare_no_pointers(char *p, size_t n) noexcept;

其使用方式与declare_reachable及undeclare_reachable类似,不过指定的是从p开始的连续n的内存。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值