【发布时间】:2012-04-15 03:51:37
【问题描述】:
我有一个使用boost::shared_ptrs 的程序,特别是依赖use_count 的准确性来执行优化。
例如,想象一个带有两个参数指针的加法运算,称为 lhs 和 rhs。假设他们都有shared_ptr<Node> 类型。当需要执行加法时,我会检查use_count,如果我发现其中一个参数的引用计数正好为1,那么我将重用它来执行操作。如果两个参数都不能重用,我必须分配一个新的数据缓冲区并就地执行操作。我正在处理庞大的数据结构,因此就地优化非常有益。
因此,我永远不能无故复制shared_ptrs,即每个函数都通过引用或常量引用来获取shared_ptrs,以避免扭曲use_count。
我的问题是:我有时有一个shared_ptr<T> &,我想将其转换为shared_ptr<T const> &,但是我怎样才能在不扭曲使用计数的情况下做到这一点? static_pointer_cast 返回一个新对象而不是引用。我倾向于认为只投射整个shared_ptr 会起作用,例如:
void f(shared_ptr<T> & x)
{
shared_ptr<T const> & x_ = *reinterpret_cast<shared_ptr<T const> *>(&x);
}
我非常怀疑这是否符合标准,但正如我所说,它可能会起作用。有没有一种方法可以保证安全和正确?
更新以聚焦问题
批评设计无助于回答这篇文章。有两个有趣的问题需要考虑:
是否保证
shared_ptr<T>和shared_ptr<T const>具有相同的布局和行为?如果 (1) 为真,那么上述 reinterpret_cast 的使用是否合法?我认为您很难找到为上述示例生成失败代码的编译器,但这并不意味着它是合法的。无论你的答案是什么,你能在 C++ 标准中找到对它的支持吗?
【问题讨论】:
-
以这种方式使用引用计数看起来像一个非常独特的设计路线。为什么不公开对操作是就地发生还是通过复制给用户进行一些控制?还是分开共享指针和唯一指针?
标签: c++ casting shared-ptr