通过引用创建别名以提升:shared_ptr
Create aliases to boost::shared_ptr via reference
我有一小段代码需要优化。线程"A"已为堆对象创建了一个提升shared_ptr。线程"A"将shared_ptr写入线程安全队列。线程"B"读取shared_ptr,使用它,然后销毁它。
深入的分析/测试证明,复制进入/退出队列的shared_ptr并调整引用计数是昂贵的。因此,我想通过引用将共享ptr传递给队列。我还想使用std::move将shared_ptr移动到队列中,而不是构建一个新的shared_ptr(我知道这会使传递到队列的shared_pt参数无效)。
所描述的一切都很好,直到我加入了一点多态性。我不能通过引用将shared_ptr传递给派生的obj,传递给期望将shared_pt传递给基类的函数。我把这归结为一个非常小的片段,暴露了让我困惑的行为
#include <boost/shared_ptr.hpp>
class Base
{
};
class Derived : public Base
{
};
int main()
{
boost::shared_ptr<Derived> pDerived(new Derived()); // simple creation
boost::shared_ptr<Derived> &alias1 = pDerived; // works fine
const boost::shared_ptr<Base> &alias2 = pDerived; // also works fine
boost::shared_ptr<Base> &alias3 = pDerived; // compilation error
//native pointers
Derived *alias4 = pDerived.get(); //works
const Base *alias5 = pDerived.get(); //works
Base *alias6 = pDerived.get(); //works
//native references
Derived &alias7 = *pDerived; // works
const Base &alias8 = *pDerived; // works
Base &alias9 = *pDerived; // works
}
我不明白为什么对alias2的赋值非常好,但对alias3的赋值会产生编译器错误。有人能解释一下吗?我需要像alias3示例那样的功能,但无法使其正常工作。
这个问题与boost或智能指针无关。POD类型也可能发生这种情况,如以下简单示例所示:
int main() {
int x = 0;
const double &y = x; //fine
double &z = x; //error!
return 0;
}
原因是临时值(rvalue)可以绑定到const&
,但不能绑定到&
。在double &z = x
中发生的情况是,x
和z
是不相关的类型,x
需要转换为double
并创建一个临时变量,该临时变量无法绑定到&
。
相关文章:
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 无法使用 libtool 将 -shared 参数传递给 g++
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- shared-ptr-C++shared_ptr与unique_ptr用于资源管理