boost::shared_ptr
,并特别依赖于use_count
的准确性来执行优化。例如,假设有两个名为lhs和rhs的参数指针进行加法操作。他们都具有类型
shared_ptr<Node>
。当进行加法操作时,我会检查use_count
,如果发现其中一个参数的引用计数恰好为1,则将其重用以在原地执行操作。如果没有任何参数可以重用,则必须分配新的数据缓冲区,并在外部执行操作。我正在处理巨大的数据结构,因此原地优化非常有益。由于这一点,我永远不能无原因复制
shared_ptr
,即每个函数通过引用或const引用传递shared_ptr
以避免扭曲use_count
。我的问题是:有时我有一个想要转换为
shared_ptr<T const> &
的shared_ptr<T> &
,但如何在不扭曲use count的情况下进行转换呢? static_pointer_cast
返回一个新对象而不是引用。我倾向于认为可以直接转换整个shared_ptr
,例如:void f(shared_ptr<T> & x)
{
shared_ptr<T const> & x_ = *reinterpret_cast<shared_ptr<T const> *>(&x);
}
我非常怀疑这不符合标准,但是如我所说,它可能会起作用。是否有一种可以保证安全和正确的方法来实现此操作?
更新以聚焦问题
批评设计并不能帮助回答这篇帖子。有两个有趣的问题需要考虑:
存在任何保证 (
boost::shared_ptr
的作者或标准,在std::tr1::shared_ptr
的情况下)shared_ptr<T>
和shared_ptr<T const>
具有相同的布局和行为吗?如果(1)是真的,则上面的reinterpret_cast使用是合法的吗?我认为你很难找到一个生成失败代码的编译器,但这并不意味着它是合法的。无论你的答案是什么,您能在C++标准中找到支持吗?