降低boost智能指针开销

1.完全单线程

如果程序是单线程,或者多线程交互由上层调度(比如我这里,c程序是单线程,上层c#程序是多线程),这时可以在编译c库时加上”-DBOOST_SP_DISABLE_THREADS”,降低智能指针开销。

BOOST_SP_DISABLE_THREADS是boost智能指针库定义的一个宏,开启这个宏后,会把底层的atomic计数,换成普通的++。这样就变成了一个普通的计数,去除了不必要的开销。
新版本中是换成了“sp_counted_base_nt.hpp”,道理是一样的。

这样我们就可以用更低的开销,写同样安全的代码,而且不用打破编码习惯,像enable_shared_from_this等着用的写法,一样统统能用,一点不用变。

2.局部单线程

在这种情况下,线程之间的通信一般用队列,那么用队列传送数据的时候可以选择性的使用share_ptr、unique_ptr.

在单线程中,也有可能有缓存等需要共享数据的情况,这时可以用local_shared_ptr,它与标准shared_ptr的不同之处在于:计数的实现方式。

计数方式
shared_ptr使用互斥体或者atomic操作,保证多线程更新计数的安全性。

local_shared_ptr
使用普通的long++,没有多线程的保障。
所以只能在同一线程中使用。

3.写一个类似shared_ptr的工具

  • 编写一个ARC类
  • 编写make_local_shared,减少一次内存分配
  • 编写一个enable_local_shared_from_this类,以便在成员函数中捕获智能指针(boost::local_shared_ptr没有这个功能,在这种场景下就使用不了 )。
  • 编写boost::get_pointer函数,这是配合boost::bind使用的,以便在最终调用所bind的函数时,获取指针。
  • 实现static_pointer_cast,dynamic_pointer_cast,用来实现智能指针的向上、向下转型。

我用的是第三种方式,如果 local_shared_ptr 能实现 enable_shared_from_this, 那它肯定是首选,可惜,没想出来支持的办法。

发表评论

电子邮件地址不会被公开。 必填项已用*标注