【发布时间】:2018-02-19 15:59:03
【问题描述】:
在我的情况下 T 是 pcl::PointCloud<pcl::PointXYZ>> 但问题应该代表任何类型 T。以下示例产生错误:
using pc = pcl::PointCloud<pcl::PointXYZ> >;
boost::shared_ptr<pc> p(new pc);
boost::shared_ptr<const pc> const_p(new pc);
// This is legal
const_p = p;
// The atomic equivalent is not
boost::atomic_store(&const_p, p);
问题是boost::atomic_store 期望两个参数都是T* 和T,但是尽管将p 分配给const_p 是完全安全的,但它们被认为是不同的类型。以下也不起作用。
boost::atomic_store(&const_p, const_cast<boost::shared_ptr<const pc> > (p));
尽管上面基本上将pc* 转换为const pc* 这是非常安全的,但它会产生一个关于const_cast 无法转换为不同类型的错误。我知道因为 pc 是一个模板参数,所以它被认为是 shared_ptr 类型的一部分,而不是 cv 限定。接下来的工作
boost::atomic_store(&const_p, boost::shared_ptr<const pc>(p));
但是,它创建了一个额外的不必要的boost::shared_ptr。据我了解,boost::const_pointer_cast<const pc>(p) 也是如此,如果不再需要 p,则可以避免这种情况。
boost::atomic_store(&const_p, boost::shared_ptr<const pc>(std::move(p));
这仍然会创建一个额外的对象,但这并不重要,因为引用计数没有被修改,这是复制 shared_ptr 的昂贵部分,因为它是原子的。
碰巧这发生在我的代码的非关键部分,所以我对上述内容很好,但我想知道以供将来参考:如果std::move 不是一个选项,怎么办?以原子方式将boost::shared_ptr<T> 存储到boost::shared_ptr<const T>,而无需创建不必要的临时指针?应该可以,因为通过const T* 查看T 是安全的,但我想不出办法。
【问题讨论】:
标签: c++ boost shared-ptr atomic