对于我正在编写的一个多平台c ++代码,我需要一个共享指针。目前该项目不使用boost,从管理角度来看,将其拉入是非常困难或不可能的。但是,我可以使用select C ++ 11功能,包括共享指针。
标准共享指针存在问题,它们可以保证线程安全。这意味着在某些平台/编译器上,如GCC(http://tinyurl.com/GCCSharedPtrLockPolicy),将不必要地使用原子和互斥,但至少我可以检查并解决由此引起的问题。然后对于其他平台(http://tinyurl.com/msvscSharedPtr),甚至似乎没有办法检查,使用了什么线程安全机制。原始的boost指针仅提供最基本的线程安全保证(http://tinyurl.com/SharedPtrThreadSafety)。
我的核心问题是,在某些平台上,Atomics会导致CPU缓存之间进行代价高昂的同步,而不需要的互斥锁可能会导致对操作系统的调用,这可能会因为完全相关的原因而延迟。此代码将是多线程的,但我们有其他同步方法用于在线程之间移动数据。不需要或不需要线程安全的共享指针。
通常情况下,我更愿意进行基准测试并做出决定,但由于这些平台会继续运行,并且也会被移植,我实际上无法做到这一点。我需要测试一些不那么受欢迎的平台,其中较少优化的编译器往往存在,但我目前没有这种能力。
我会尝试推动获得Boost指针,但这不太可能,当我失败时,我的其他选择是什么?与此同时,我将研究试图从助推器中获取Shared_ptr,但我认为这并不容易。
我可以自己动手。这似乎是一个可怕的想法,为什么我必须重新发明这个基本的东西。
如果有一个简单且具有足够自由许可的库,那么我可以简单地复制他们的shared_ptr代码并简化自己的编译。
编辑:从除了标题库以外的提升中拉入任何内容都已被删除。我将研究Loki作为回答者的建议之一。如果失败并且没有答案在这里实现,我将推出自己的:(。
答案 0 :(得分:4)
我会看一下Loki中的那个。 Loki比boost更小,Loki中的智能指针实现是高度可配置的。
答案 1 :(得分:3)
boost shared_ptr支持单线程使用
来自boost shared_ptr 的引文你可以在项目范围内#define宏BOOST_SP_DISABLE_THREADS切换到普通的非原子引用计数更新
答案 2 :(得分:2)
gcc有一个类__shared_ptr
,它采用锁定策略。 shared_ptr
推导出这一点。
其中一个策略是_S_single
,用于单线程代码(即:非锁定/非原子引用计数)
在c ++ 11中,您可以使用模板别名,这样您就可以使用__shared_ptr
派生的非标准shared_ptr
类
template<typename T>
using st_ptr = __shared_ptr<T, __gnu_cxx::_S_single>;
如果你还没有一致的编译器你可以通过继承off __shared_ptr
并暴露接口来推广自己的(事实上这就是gcc目前的做法,因为模板别名不是4.7之前可用
查看bits/shared_ptr.h
以了解shared_ptr
如何从__shared_ptr
中获取 - 推广自己将会轻而易举。
答案 3 :(得分:1)
很有可能编写/调整您自己的智能指针类,以便在较新的库不支持的旧项目中使用。出于这样的原因,我已经编写了自己的内容,并且它适用于MSVC ++ 4.2及以后版本。
请参阅ootips.org/yonat/4dev/smart-pointers.html,这是我的基础。如果你想要一个小解决方案,绝对是一种可能性。只需要标题和.cpp文件。
需要注意的一点是旧版编译器中缺少explicit
关键字。另一个原因是您可能希望允许隐式转换为原始指针以允许您的API受到更少的影响(我们这样做了),在这种情况下,您还应该注意防止转换为其他类型的指针。